From ed2b8342df46c1bbd3919fe3734cdde234d2d132 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Tue, 30 Aug 2022 02:08:15 +0100 Subject: [PATCH 01/11] Prepare for new components in avrdude.conf incl prog_modes - Add prog_modes to part and programmer definitions; prog_mode is a bitwise or of programming modes + PM_SPM: Bootloaders, self-programming with SPM/NVM Controllers + PM_TPI: t4, t5, t9, t10, t20, t40, t102, t104 + PM_ISP: SPI programming for In-System Programming (typ classic parts) + PM_PDI: Program and Debug Interface (xmega parts) + PM_UPDI: Unified Program and Debug Interface + PM_HVSP: High Voltage Serial Programming (some classic parts) + PM_HVPP: High Voltage Parallel Programming (most non-HVSP classic parts) + PM_debugWIRE: Simpler alternative to JTAG (a subset of HVPP/HVSP parts) + PM_JTAG: some classic parts, some xmega + PM_aWire: AVR32 parts - Add mcuid, a unique id in 0..2039, to part definition for urclock programmer - Add n_interrupts, the number of interrupts, to part definition - Add n_page_erase to part definition (# of pages erased during NVM erase) - Implement a simple calculator in config_gram.y so numeric values can be expressed as simple expressions such as PM_SPM | PM_UPDI - Introduce a new method of assigning simple components to the grammar without touching config_gram.y via an eligible-component list in config.c; numeric expressions on the rhs of an assignment resolve to integer values - Update documentation in avrdude.conf.in and avrdude.texi --- src/avrdude.conf.in | 60 +++++++++----- src/config.c | 154 ++++++++++++++++++++++++++++++++++-- src/config.h | 59 ++++++++++++-- src/config_gram.y | 112 +++++++++++++++++++------- src/developer_opts.c | 39 +++++++++- src/doc/avrdude.texi | 181 +++++++++++++++++++++++++++---------------- src/lexer.l | 39 ++++++++-- src/libavrdude.h | 40 +++++++++- 8 files changed, 542 insertions(+), 142 deletions(-) diff --git a/src/avrdude.conf.in b/src/avrdude.conf.in index 5a68cff5..e2a330ff 100644 --- a/src/avrdude.conf.in +++ b/src/avrdude.conf.in @@ -21,39 +21,56 @@ # id = [, [, ] ...] ; # are quoted strings # desc = ; # quoted string # type = ; # programmer type, quoted string -# # supported programmer types can be listed by "-c ?type" +# # supported types can be listed by "-c ?type" +# prog_modes = PM_ {| PM_} # interfaces, eg, PM_SPM|PM_PDI (1) # connection_type = parallel | serial | usb | spi # baudrate = ; # baudrate for avr910-programmer -# vcc = [, ... ] ; # pin number(s) -# buff = [, ... ] ; # pin number(s) -# reset = ; # pin number -# sck = ; # pin number -# mosi = ; # pin number -# miso = ; # pin number -# errled = ; # pin number -# rdyled = ; # pin number -# pgmled = ; # pin number -# vfyled = ; # pin number +# vcc = [, ... ] ; # pin number(s) +# buff = [, ... ] ; # pin number(s) +# reset = ; # pin number +# sck = ; # pin number +# mosi = ; # pin number +# miso = ; # pin number +# errled = ; # pin number +# rdyled = ; # pin number +# pgmled = ; # pin number +# vfyled = ; # pin number # usbvid = ; # USB VID (Vendor ID) -# usbpid = [, ...] ; # USB PID (Product ID) (1) +# usbpid = [, ...] ; # USB PID (Product ID) (2) # usbdev = ; # USB interface or other device info # usbvendor = ; # USB Vendor Name # usbproduct = ; # USB Product Name # usbsn = ; # USB Serial Number # hvupdi_support = [, , ... ] ; # UPDI HV Variants Support -# -# To invert a bit, use = ~ , the spaces are important. -# For a pin list all pins must be inverted. -# A single pin can be specified as usual = ~ , for lists -# specify it as follows = ~ ( [, ... ] ) . -# -# (1) Not all programmer types can process a list of PIDs. # ; # +# # To invert a bit, use = ~ , the spaces are important. +# # For a pin list all pins must be inverted. +# # A single pin can be specified as usual = ~ , for lists +# # specify it as follows = ~ ( [, ... ] ). +# # +# # (1) The following program modes are known: +# # - PM_SPM: Bootloaders, self-programming with SPM opcodes or NVM Controllers +# # - PM_TPI: Tiny Programming Interface (t4, t5, t9, t10, t20, t40, t102, t104) +# # - PM_ISP: SPI programming for In-System Programming (almost all classic parts) +# # - PM_PDI: Program and Debug Interface (xmega parts) +# # - PM_UPDI: Unified Program and Debug Interface +# # - PM_HVSP: High Voltage Serial Programming (some classic parts) +# # - PM_HVPP: High Voltage Parallel Programming (most non-HVSP classic parts) +# # - PM_debugWIRE: Simpler alternative to JTAG (a subset of HVPP/HVSP parts) +# # - PM_JTAG: Joint Test Action Group standard (some classic parts, some xmega) +# # - PM_aWire: AVR32 parts +# # +# # (2) Not all programmer types can process a list of PIDs +# # part # desc = ; # quoted string # id = ; # quoted string # family_id = ; # quoted string, eg, "megaAVR" or "tinyAVR" +# prog_modes = PM_ {| PM_} # interfaces, eg, PM_SPM|PM_ISP|PM_HVPP|PM_debugWIRE +# mcuid = ; # unique id in 0..2039 for urclock programmer +# n_interrupts = ; # number of interrupts, used for vector bootloaders +# n_page_erase = ; # if set, number of pages erased during NVM erase # hvupdi_variant = ; # numeric -1 (n/a) or 0..2 # devicecode = ; # deprecated, use stk500_devcode # stk500_devcode = ; # numeric @@ -63,8 +80,9 @@ # has_pdi = ; # part has PDI i/f # has_updi = ; # part has UPDI i/f # has_tpi = ; # part has TPI i/f -# is_at90s1200 = ; # AT90S1200 part # is_avr32 = ; # AVR32 part +# +# is_at90s1200 = ; # AT90S1200 part # signature = ; # signature bytes # usbpid = ; # DFU USB PID # chip_erase_delay = ; # micro-seconds @@ -247,7 +265,7 @@ # section avr061.zip which accompanies the application note # AVR061 available from: # -# http://www.atmel.com/dyn/resources/prod_documents/doc2525.pdf +# https://ww1.microchip.com/downloads/en/Appnotes/doc2525.pdf # #define ATTINY10 0x10 /* the _old_ one that never existed! */ diff --git a/src/config.c b/src/config.c index d36e0814..531dac83 100644 --- a/src/config.c +++ b/src/config.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -44,6 +45,7 @@ LISTID number_list; PROGRAMMER * current_prog; AVRPART * current_part; AVRMEM * current_mem; +int current_strct; LISTID part_list; LISTID programmers; bool is_alias; @@ -53,6 +55,22 @@ char * cfg_infile; extern char * yytext; +#define pgm_comp_desc(x, type) { #x, COMP_PROGRAMMER, offsetof(PROGRAMMER, x), sizeof(((PROGRAMMER *) NULL)->x), type } +#define part_comp_desc(x, type) { #x, COMP_AVRPART, offsetof(AVRPART, x), sizeof(((AVRPART *) NULL)->x), type } +#define mem_comp_desc(x, type) { #x, COMP_AVRMEM, offsetof(AVRMEM, x), sizeof(((AVRMEM *) NULL)->x), type } + +// Component description for config_gram.y, will be sorted appropriately on first use +Component_t avr_comp[] = { + // PROGRAMMER + pgm_comp_desc(prog_modes, COMP_INT), + + // AVRPART + part_comp_desc(prog_modes, COMP_INT), + part_comp_desc(mcuid, COMP_INT), + part_comp_desc(n_interrupts, COMP_INT), + part_comp_desc(n_page_erase, COMP_INT), +}; + #define DEBUG 0 void cleanup_config(void) @@ -190,7 +208,7 @@ void free_tokens(int n, ...) -TOKEN *number(const char *text) { +TOKEN *new_number(const char *text) { struct token_t *tkn = new_token(TKN_NUMBER); tkn->value.type = V_NUM; tkn->value.number = atoi(text); @@ -202,7 +220,7 @@ TOKEN *number(const char *text) { return tkn; } -TOKEN *number_real(const char *text) { +TOKEN *new_number_real(const char *text) { struct token_t * tkn = new_token(TKN_NUMBER); tkn->value.type = V_NUM_REAL; tkn->value.number_real = atof(text); @@ -214,7 +232,7 @@ TOKEN *number_real(const char *text) { return tkn; } -TOKEN *hexnumber(const char *text) { +TOKEN *new_hexnumber(const char *text) { struct token_t *tkn = new_token(TKN_NUMBER); char * e; @@ -233,11 +251,41 @@ TOKEN *hexnumber(const char *text) { return tkn; } +TOKEN *new_constant(const char *con) { + struct token_t *tkn = new_token(TKN_NUMBER); + int assigned = 1; -TOKEN *string(const char *text) { + tkn->value.type = V_NUM; + tkn->value.number = + !strcmp("PM_SPM", con)? PM_SPM: + !strcmp("PM_TPI", con)? PM_TPI: + !strcmp("PM_ISP", con)? PM_ISP: + !strcmp("PM_PDI", con)? PM_PDI: + !strcmp("PM_UPDI", con)? PM_UPDI: + !strcmp("PM_HVSP", con)? PM_HVSP: + !strcmp("PM_HVPP", con)? PM_HVPP: + !strcmp("PM_debugWIRE", con)? PM_debugWIRE: + !strcmp("PM_JTAG", con)? PM_JTAG: + !strcmp("PM_aWire", con)? PM_aWire: + (assigned = 0); + + if(!assigned) { + yyerror("can't identify constant %s", con); + free_token(tkn); + return NULL; + } + +#if DEBUG + avrdude_message(MSG_INFO, "CONSTANT(%s=%d)\n", con, tkn->value.number); +#endif + + return tkn; +} + +TOKEN *new_string(const char *text) { struct token_t *tkn = new_token(TKN_STRING); tkn->value.type = V_STR; - tkn->value.string = cfg_strdup("string()", text); + tkn->value.string = cfg_strdup("new_string()", text); #if DEBUG avrdude_message(MSG_INFO, "STRING(%s)\n", tkn->value.string); @@ -247,7 +295,7 @@ TOKEN *string(const char *text) { } -TOKEN * keyword(int primary) { +TOKEN *new_keyword(int primary) { return new_token(primary); } @@ -692,3 +740,97 @@ char *cfg_escape(const char *s) { return cfg_strdup("cfg_escape()", buf); } + + +static int cmp_comp(const void *v1, const void *v2) { + const Component_t *c1 = v1, *c2 = v2; + int ret = strcmp(c1->name, c2->name); + + return ret? ret: c1->strct - c2->strct; +} + +Component_t *cfg_comp_search(const char *name, int strct) { + static int init; + Component_t key; + + if(!init++) + qsort(avr_comp, sizeof avr_comp/sizeof*avr_comp, sizeof(Component_t), cmp_comp); + + + key.name = name; + key.strct = strct; + return bsearch(&key, avr_comp, sizeof avr_comp/sizeof*avr_comp, sizeof(Component_t), cmp_comp); +} + + +const char *cfg_strct_name(int strct) { + switch(strct) { + case COMP_CONFIG_MAIN: return "avrdude.conf main"; + case COMP_AVRPART: return "AVRPART"; + case COMP_AVRMEM: return "AVRMEM"; + case COMP_PROGRAMMER: return "PROGRAMMER"; + } + return "unknown struct"; +} + +const char *cfg_v_type(int type) { + switch(type) { + case V_NONE: return "void"; + case V_NUM: return "number"; + case V_NUM_REAL: return "real"; + case V_STR: return "string"; + case V_COMPONENT: return "component"; + } + return "unknown v type"; +} + +const char *cfg_comp_type(int type) { + switch(type) { + case COMP_INT: return "number"; + case COMP_SHORT: return "short"; + case COMP_CHAR: return "char"; + case COMP_STRING: return "string"; + case COMP_CHAR_ARRAY: return "byte array"; + case COMP_INT_LISTID: return "number list"; + case COMP_STRING_LISTID: return "string list"; + case COMP_OPCODE: return "opcode"; + case COMP_PIN: return "pin"; + case COMP_PIN_LIST: return "pin list"; + } + return "unknown comp type"; +} + + +// Used by config_gram.y to assign a component in one of the relevant structures with a value +void cfg_assign(char *sp, int strct, Component_t *cp, VALUE *v) { + const char *str; + int num; + + switch(cp->type) { + case COMP_CHAR: + case COMP_SHORT: + case COMP_INT: + if(v->type != V_NUM) { + yywarning("%s in %s expects a %s but is assigned a %s", + cp->name, cfg_strct_name(strct), cfg_comp_type(cp->type), cfg_v_type(v->type)); + return; + } + // TODO: consider endianess (code currently assumes little endian) + num = v->number; + memcpy(sp+cp->offset, &num, cp->size); + break; + case COMP_STRING: + if(v->type != V_STR) { + yywarning("%s in %s expects a string but is assigned a %s", + cp->name, cfg_strct_name(strct), cfg_v_type(v->type)); + return; + } + str = cache_string(v->string); + memcpy(sp+cp->offset, &str, cp->size); + break; + // TODO: implement COMP_CHAR_ARRAY, COMP_INT_LISTID, COMP_STRING_LISTID, ... + default: + yywarning("%s in %s expects a %s but that is not implemented", + cp->name, cfg_strct_name(strct), cfg_comp_type(cp->type)); + } +} diff --git a/src/config.h b/src/config.h index b8bd2031..42b6219b 100644 --- a/src/config.h +++ b/src/config.h @@ -37,13 +37,48 @@ typedef struct { } COMMENT; -enum { V_NONE, V_NUM, V_NUM_REAL, V_STR }; +enum { // Which structures a component can occur in + COMP_CONFIG_MAIN, + COMP_PROGRAMMER, + COMP_AVRPART, + COMP_AVRMEM, +}; + +enum { // Component types in structure + COMP_INT, + COMP_SHORT, + COMP_CHAR, + COMP_STRING, + COMP_CHAR_ARRAY, // This and below are not yet implemented + COMP_INT_LISTID, + COMP_STRING_LISTID, + COMP_OPCODE, + COMP_PIN, // Pins may never be implemented + COMP_PIN_LIST +}; + +typedef struct { // Description of a component in a structure + const char *name; // Component name + int strct; // Structure, eg, COMP_AVRPART + int offset, size, type; // Location, size and type within structure +} Component_t; + + +enum { // Value types for VALUE struct + V_NONE, + V_NUM, + V_NUM_REAL, + V_STR, + V_COMPONENT, +}; + typedef struct value_t { int type; union { int number; double number_real; char * string; + Component_t *comp; }; } VALUE; @@ -59,6 +94,7 @@ extern FILE * yyin; extern PROGRAMMER * current_prog; extern AVRPART * current_part; extern AVRMEM * current_mem; +int current_strct; extern int cfg_lineno; extern char * cfg_infile; extern LISTID string_list; @@ -87,15 +123,17 @@ void free_token(TOKEN *tkn); void free_tokens(int n, ...); -TOKEN *number(const char *text); +TOKEN *new_number(const char *text); -TOKEN *number_real(const char *text); +TOKEN *new_number_real(const char *text); -TOKEN *hexnumber(const char *text); +TOKEN *new_hexnumber(const char *text); -TOKEN *string(const char *text); +TOKEN *new_constant(const char *text); -TOKEN *keyword(int primary); +TOKEN *new_string(const char *text); + +TOKEN *new_keyword(int primary); void print_token(TOKEN *tkn); @@ -115,6 +153,15 @@ LISTID cfg_move_comments(void); void cfg_pop_comms(void); +Component_t *cfg_comp_search(const char *name, int strct); + +const char *cfg_v_type(int type); + +const char *cfg_strct_name(int strct); + +void cfg_assign(char *sp, int strct, Component_t *cp, VALUE *v); + + #ifdef __cplusplus } #endif diff --git a/src/config_gram.y b/src/config_gram.y index dfdf50b5..bc48d098 100644 --- a/src/config_gram.y +++ b/src/config_gram.y @@ -208,12 +208,19 @@ static int pin_name; %token TKN_COMMA %token TKN_EQUAL %token TKN_SEMI -%token TKN_TILDE %token TKN_LEFT_PAREN %token TKN_RIGHT_PAREN %token TKN_NUMBER %token TKN_NUMBER_REAL %token TKN_STRING +%token TKN_COMPONENT + +%left OP_OR /* calculator operations */ +%left OP_XOR +%left OP_AND +%left OP_PLUS OP_MINUS +%left OP_TIMES OP_DIVIDE OP_MODULO +%right OP_TILDE UNARY %start configuration @@ -229,6 +236,27 @@ number_real : TKN_NUMBER_REAL { $$ = $1; } +; + + +expr: numexpr | TKN_STRING; + +numexpr: + TKN_NUMBER | + numexpr OP_OR numexpr { $$ = $1; $$->value.number |= $3->value.number; } | + numexpr OP_XOR numexpr { $$ = $1; $$->value.number ^= $3->value.number; } | + numexpr OP_AND numexpr { $$ = $1; $$->value.number &= $3->value.number; } | + numexpr OP_PLUS numexpr { $$ = $1; $$->value.number += $3->value.number; } | + numexpr OP_MINUS numexpr { $$ = $1; $$->value.number -= $3->value.number; } | + numexpr OP_TIMES numexpr { $$ = $1; $$->value.number *= $3->value.number; } | + numexpr OP_DIVIDE numexpr { $$ = $1; $$->value.number /= $3->value.number; } | + numexpr OP_MODULO numexpr { $$ = $1; $$->value.number %= $3->value.number; } | + OP_PLUS numexpr %prec UNARY { $$ = $2; } | + OP_MINUS numexpr %prec UNARY { $$ = $2; $$->value.number = -$$->value.number; } | + OP_TILDE numexpr %prec UNARY { $$ = $2; $$->value.number = ~$$->value.number; } | + TKN_LEFT_PAREN numexpr TKN_RIGHT_PAREN { $$ = $2; } +; + configuration : /* empty */ | config @@ -302,6 +330,7 @@ prog_def : // pgm_fill_old_pins(current_prog); // TODO to be removed if old pin data no longer needed // pgm_display_generic(current_prog, id); current_prog = NULL; + current_strct = COMP_CONFIG_MAIN; } ; @@ -309,6 +338,7 @@ prog_def : prog_decl : K_PROGRAMMER { current_prog = pgm_new(); + current_strct = COMP_PROGRAMMER; current_prog->config_file = cache_string(cfg_infile); current_prog->lineno = cfg_lineno; } @@ -322,6 +352,7 @@ prog_decl : YYABORT; } current_prog = pgm_dup(pgm); + current_strct = COMP_PROGRAMMER; current_prog->parent_id = cache_string($3->value.string); current_prog->comments = NULL; current_prog->config_file = cache_string(cfg_infile); @@ -389,6 +420,7 @@ part_def : current_part->comments = cfg_move_comments(); LISTADD(part_list, current_part); current_part = NULL; + current_strct = COMP_CONFIG_MAIN; } ; @@ -396,6 +428,7 @@ part_decl : K_PART { current_part = avr_new_part(); + current_strct = COMP_AVRPART; current_part->config_file = cache_string(cfg_infile); current_part->lineno = cfg_lineno; } | @@ -409,6 +442,7 @@ part_decl : } current_part = avr_dup_part(parent_part); + current_strct = COMP_AVRPART; current_part->parent_id = cache_string($3->value.string); current_part->comments = NULL; current_part->config_file = cache_string(cfg_infile); @@ -435,6 +469,10 @@ prog_parms : ; prog_parm : + TKN_COMPONENT TKN_EQUAL expr { + cfg_assign((char *) current_prog, COMP_PROGRAMMER, $1->value.comp, &$3->value); + free_token($1); + } | K_ID TKN_EQUAL string_list { { while (lsize(string_list)) { @@ -589,7 +627,7 @@ hvupdi_support_list: pin_number_non_empty: TKN_NUMBER { if(0 != assign_pin(pin_name, $1, 0)) YYABORT; } | - TKN_TILDE TKN_NUMBER { if(0 != assign_pin(pin_name, $2, 1)) YYABORT; } + OP_TILDE TKN_NUMBER { if(0 != assign_pin(pin_name, $2, 1)) YYABORT; } ; pin_number: @@ -601,7 +639,7 @@ pin_number: pin_list_element: pin_number_non_empty | - TKN_TILDE TKN_LEFT_PAREN num_list TKN_RIGHT_PAREN { if(0 != assign_pin_list(1)) YYABORT; } + OP_TILDE TKN_LEFT_PAREN num_list TKN_RIGHT_PAREN { if(0 != assign_pin_list(1)) YYABORT; } ; pin_list_non_empty: @@ -665,6 +703,10 @@ retry_lines : ; part_parm : + TKN_COMPONENT TKN_EQUAL expr { + cfg_assign((char *) current_part, COMP_AVRPART, $1->value.comp, &$3->value); + free_token($1); + } | K_ID TKN_EQUAL TKN_STRING { current_part->id = cache_string($3->value.string); @@ -1075,51 +1117,61 @@ part_parm : K_HAS_JTAG TKN_EQUAL yesno { - if ($3->primary == K_YES) + if ($3->primary == K_YES) { current_part->flags |= AVRPART_HAS_JTAG; - else if ($3->primary == K_NO) + current_part->prog_modes |= PM_JTAG; + } else if ($3->primary == K_NO) { current_part->flags &= ~AVRPART_HAS_JTAG; - + current_part->prog_modes &= ~PM_JTAG; + } free_token($3); } | K_HAS_DW TKN_EQUAL yesno { - if ($3->primary == K_YES) + if ($3->primary == K_YES) { current_part->flags |= AVRPART_HAS_DW; - else if ($3->primary == K_NO) + current_part->prog_modes |= PM_debugWIRE; + } else if ($3->primary == K_NO) { current_part->flags &= ~AVRPART_HAS_DW; - + current_part->prog_modes &= ~PM_debugWIRE; + } free_token($3); } | K_HAS_PDI TKN_EQUAL yesno { - if ($3->primary == K_YES) + if ($3->primary == K_YES) { current_part->flags |= AVRPART_HAS_PDI; - else if ($3->primary == K_NO) + current_part->prog_modes |= PM_PDI; + } else if ($3->primary == K_NO) { current_part->flags &= ~AVRPART_HAS_PDI; - + current_part->prog_modes &= ~PM_PDI; + } free_token($3); } | K_HAS_UPDI TKN_EQUAL yesno { - if ($3->primary == K_YES) + if ($3->primary == K_YES) { current_part->flags |= AVRPART_HAS_UPDI; - else if ($3->primary == K_NO) + current_part->prog_modes |= PM_UPDI; + } else if ($3->primary == K_NO) { current_part->flags &= ~AVRPART_HAS_UPDI; - + current_part->prog_modes &= ~PM_UPDI; + } free_token($3); } | K_HAS_TPI TKN_EQUAL yesno { - if ($3->primary == K_YES) + if ($3->primary == K_YES) { current_part->flags |= AVRPART_HAS_TPI; - else if ($3->primary == K_NO) + current_part->prog_modes |= PM_TPI; + } else if ($3->primary == K_NO) { current_part->flags &= ~AVRPART_HAS_TPI; - + current_part->prog_modes &= ~PM_TPI; + } free_token($3); } | @@ -1135,11 +1187,13 @@ part_parm : K_IS_AVR32 TKN_EQUAL yesno { - if ($3->primary == K_YES) + if ($3->primary == K_YES) { current_part->flags |= AVRPART_AVR32; - else if ($3->primary == K_NO) + current_part->prog_modes |= PM_aWire; + } else if ($3->primary == K_NO) { current_part->flags &= ~AVRPART_AVR32; - + current_part->prog_modes &= ~PM_aWire; + } free_token($3); } | @@ -1255,14 +1309,6 @@ part_parm : } | -/* - K_EEPROM { current_mem = AVR_M_EEPROM; } - mem_specs | - - K_FLASH { current_mem = AVR_M_FLASH; } - mem_specs | -*/ - K_MEMORY TKN_STRING { /* select memory for extension or create if not there */ AVRMEM *mem = avr_locate_mem_noalias(current_part, $2->value.string); @@ -1273,6 +1319,7 @@ part_parm : } avr_add_mem_order($2->value.string); current_mem = mem; + current_strct = COMP_AVRMEM; free_token($2); } mem_specs @@ -1295,6 +1342,7 @@ part_parm : } cfg_pop_comms(); current_mem = NULL; + current_strct = COMP_AVRPART; } | K_MEMORY TKN_STRING TKN_EQUAL K_NULL { @@ -1306,6 +1354,7 @@ part_parm : free_token($2); cfg_pop_comms(); current_mem = NULL; + current_strct = COMP_AVRPART; } | opcode TKN_EQUAL string_list { { @@ -1355,6 +1404,11 @@ mem_specs : mem_spec : + TKN_COMPONENT TKN_EQUAL expr { + cfg_assign((char *) current_mem, COMP_AVRMEM, $1->value.comp, &$3->value); + free_token($1); + } | + K_PAGED TKN_EQUAL yesno { current_mem->paged = $3->primary == K_YES ? 1 : 0; diff --git a/src/developer_opts.c b/src/developer_opts.c index c8aa903c..8f716f03 100644 --- a/src/developer_opts.c +++ b/src/developer_opts.c @@ -63,7 +63,7 @@ static struct { const char *mcu, *var, *value; } ptinj[] = { // Add triples here, eg, {"ATmega328P", "mcuid", "999"}, - {NULL, NULL, NULL}, + {NULL, NULL, NULL}, }; static struct { @@ -134,7 +134,7 @@ static void printallopcodes(const AVRPART *p, const char *d, OPCODE * const *opa // Programming modes -static char *prog_modes(const AVRPART *p) { +static char *prog_modes_str_flags(const AVRPART *p) { static char type[1024]; *type = 0; @@ -194,6 +194,34 @@ static char *prog_modes(const AVRPART *p) { return type + (*type == '|'); } +static char *prog_modes_str(int pm) { + static char type[1024]; + + strcpy(type, "0"); + if(pm & PM_SPM) + strcat(type, " | PM_SPM"); + if(pm & PM_TPI) + strcat(type, " | PM_TPI"); + if(pm & PM_ISP) + strcat(type, " | PM_ISP"); + if(pm & PM_PDI) + strcat(type, " | PM_PDI"); + if(pm & PM_UPDI) + strcat(type, " | PM_UPDI"); + if(pm & PM_HVSP) + strcat(type, " | PM_HVSP"); + if(pm & PM_HVPP) + strcat(type, " | PM_HVPP"); + if(pm & PM_debugWIRE) + strcat(type, " | PM_debugWIRE"); + if(pm & PM_JTAG) + strcat(type, " | PM_JTAG"); + if(pm & PM_aWire) + strcat(type, " | PM_aWire"); + + return type + (type[1] == 0? 0: 4); +} + // Check whether address bits are where they should be in ISP commands static void checkaddr(int memsize, int pagesize, int opnum, const OPCODE *op, const AVRPART *p, const AVRMEM *m) { @@ -573,6 +601,10 @@ static void dev_part_strct(const AVRPART *p, bool tsv, const AVRPART *base, bool _if_partout_str(strcmp, descstr, desc); _if_partout_str(strcmp, cfg_escape(p->id), id); _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(intcmp, "%d", mcuid); + _if_partout(intcmp, "%d", n_interrupts); + _if_partout(intcmp, "%d", n_page_erase); _if_partout(intcmp, "%d", hvupdi_variant); _if_partout(intcmp, "0x%02x", stk500_devcode); _if_partout(intcmp, "0x%02x", avr910_devcode); @@ -1032,7 +1064,7 @@ void dev_output_part_defs(char *partdesc) { nfuses, ok, p->flags, - prog_modes(p), + prog_modes_str_flags(p), p->config_file, p->lineno ); } @@ -1189,6 +1221,7 @@ 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(!base || base->conntype != pgm->conntype) _pgmout_fmt("connection_type", "%s", connstr(pgm->conntype)); _if_pgmout(intcmp, "%d", baudrate); diff --git a/src/doc/avrdude.texi b/src/doc/avrdude.texi index cdc7602b..19d019c5 100644 --- a/src/doc/avrdude.texi +++ b/src/doc/avrdude.texi @@ -1694,34 +1694,53 @@ The format of the programmer definition is as follows: @smallexample programmer - parent # is a quoted string + parent # optional parent id = [, [, ] ...] ; # are quoted strings desc = ; # quoted string - type = "par" | "stk500" | ... ; # programmer type (see below for a list) - baudrate = ; # baudrate for serial ports - vcc = [, ... ] ; # pin number(s) - buff = [, ... ] ; # pin number(s) - reset = ; # pin number - sck = ; # pin number - mosi = ; # pin number - miso = ; # pin number - errled = ; # pin number - rdyled = ; # pin number - pgmled = ; # pin number - vfyled = ; # pin number - usbvid = ; # USB VID (Vendor ID) - usbpid = [, ...]; # USB PID (Product ID) - usbdev = ; # USB interface or other device info - usbvendor = ; # USB Vendor Name - usbproduct = ; # USB Product Name - usbsn = ; # USB Serial Number - ; + type = ; # programmer type, quoted string + # supported types can be listed by "-c ?type" + prog_modes = PM_ @{ | PM_ @} # interfaces, eg, PM_SPM|PM_PDI + connection_type = parallel | serial | usb | spi + baudrate = ; # baudrate for avr910-programmer + vcc = [, ... ] ; # pin number(s) + buff = [, ... ] ; # pin number(s) + reset = ; # pin number + sck = ; # pin number + mosi = ; # pin number + miso = ; # pin number + errled = ; # pin number + rdyled = ; # pin number + pgmled = ; # pin number + vfyled = ; # pin number + usbvid = ; # USB VID (Vendor ID) + usbpid = [, ...] ; # USB PID (Product ID) + usbdev = ; # USB interface or other device info + usbvendor = ; # USB Vendor Name + usbproduct = ; # USB Product Name + usbsn = ; # USB Serial Number + hvupdi_support = [, , ... ] ; # UPDI HV Variants Support +; @end smallexample @noindent If a parent is specified, all settings of it (except its ids) are used for the new programmer. These values can be changed by new setting them for the new programmer. +@noindent +Known programming modes are +@itemize @bullet +@item @code{PM_SPM}: Bootloaders, self-programming with SPM opcodes or NVM Controllers +@item @code{PM_TPI}: Tiny Programming Interface (t4, t5, t9, t10, t20, t40, t102, t104) +@item @code{PM_ISP}: SPI programming for In-System Programming (almost all classic parts) +@item @code{PM_PDI}: Program and Debug Interface (xmega parts) +@item @code{PM_UPDI}: Unified Program and Debug Interface +@item @code{PM_HVSP}: High Voltage Serial Programming (some classic parts) +@item @code{PM_HVPP}: High Voltage Parallel Programming (most non-HVSP classic parts) +@item @code{PM_debugWIRE}: Simpler alternative to JTAG (a subset of HVPP/HVSP parts) +@item @code{PM_JTAG}: Joint Test Action Group standard (some classic parts, some xmega) +@item @code{PM_aWire}: AVR32 parts +@end itemize + @noindent To invert a bit in the pin definitions, use @code{= ~ }. @@ -1729,7 +1748,7 @@ To invert a bit in the pin definitions, use @code{= ~ }. Not all programmer types can handle a list of USB PIDs. @noindent -Following programmer types are currently implemented: +The following programmer types are currently implemented: @multitable @columnfractions .25 .6 @include programmer_types.texi @@ -1743,29 +1762,35 @@ Following programmer types are currently implemented: @smallexample part - id = ; # quoted string desc = ; # quoted string - family_id = ; # quoted string + id = ; # quoted string + family_id = ; # quoted string, eg, "megaAVR" or "tinyAVR" + prog_modes = PM_ @{ | PM_ @} # interfaces, eg, PM_SPM|PM_ISP|PM_HVPP|PM_debugWIRE + mcuid = ; # unique id in 0..2039 for urclock programmer + n_interrupts = ; # number of interrupts, used for vector bootloaders + n_page_erase = ; # if set, number of pages erased during NVM erase + hvupdi_variant = ; # numeric -1 (n/a) or 0..2 + devicecode = ; # deprecated, use stk500_devcode + stk500_devcode = ; # numeric + avr910_devcode = ; # numeric has_jtag = ; # part has JTAG i/f has_debugwire = ; # part has debugWire i/f has_pdi = ; # part has PDI i/f has_updi = ; # part has UPDI i/f has_tpi = ; # part has TPI i/f - devicecode = ; # numeric - stk500_devcode = ; # numeric - avr910_devcode = ; # numeric + is_avr32 = ; # AVR32 part + is_at90s1200 = ; # AT90S1200 part signature = ; # signature bytes usbpid = ; # DFU USB PID - reset = dedicated | io; - retry_pulse = reset | sck; - pgm_enable = ; - chip_erase = ; chip_erase_delay = ; # micro-seconds + reset = dedicated | io ; + retry_pulse = reset | sck ; + chip_erase_delay = ; # chip erase delay (us) # STK500 parameters (parallel programming IO lines) pagel = ; # pin name in hex, i.e., 0xD7 bs2 = ; # pin name in hex, i.e., 0xA0 serial = ; # can use serial downloading - parallel = ; # can use par. programming + parallel = ; # can use par. programming # STK500v2 parameters, to be taken from Atmel's XML files timeout = ; stabdelay = ; @@ -1777,52 +1802,59 @@ part predelay = ; postdelay = ; pollmethod = ; - mode = ; - delay = ; - blocksize = ; - readsize = ; hvspcmdexedelay = ; # STK500v2 HV programming parameters, from XML - pp_controlstack = , , ...; # PP only - hvsp_controlstack = , , ...; # HVSP only - hventerstabdelay = ; - progmodedelay = ; # PP only - latchcycles = ; - togglevtg = ; - poweroffdelay = ; - resetdelayms = ; - resetdelayus = ; - hvleavestabdelay = ; - resetdelay = ; - synchcycles = ; # HVSP only - chiperasepulsewidth = ; # PP only - chiperasepolltimeout = ; - chiperasetime = ; # HVSP only - programfusepulsewidth = ; # PP only - programfusepolltimeout = ; - programlockpulsewidth = ; # PP only - programlockpolltimeout = ; + pp_controlstack = , , ... ; # PP only + hvsp_controlstack = , , ... ; # HVSP only + flash_instr = , , ; + eeprom_instr = , , ... ; + hventerstabdelay = ; + progmodedelay = ; # PP only + latchcycles = ; + togglevtg = ; + poweroffdelay = ; + resetdelayms = ; + resetdelayus = ; + hvleavestabdelay = ; + resetdelay = ; + synchcycles = ; # HVSP only + chiperasepulsewidth = ; # PP only + chiperasepolltimeout = ; + chiperasetime = ; # HVSP only + programfusepulsewidth = ; # PP only + programfusepolltimeout = ; + programlockpulsewidth = ; # PP only + programlockpolltimeout = ; # JTAG ICE mkII parameters, also from XML files allowfullpagebitstream = ; enablepageprogramming = ; - idr = ; # IO addr of IDR (OCD) reg. - rampz = ; # IO addr of RAMPZ reg. - spmcr = ; # mem addr of SPMC[S]R reg. - eecr = ; # mem addr of EECR reg. - # (only when != 0x3F) - is_at90s1200 = ; # AT90S1200 part - is_avr32 = ; # AVR32 part + idr = ; # IO addr of IDR (OCD) reg + rampz = ; # IO addr of RAMPZ reg + spmcr = ; # mem addr of SPMC[S]R reg + eecr = ; # mem addr of EECR reg only when != 0x3f + mcu_base = ; + nvm_base = ; + ocd_base = ; + ocdrev = ; + pgm_enable = ; + chip_erase = ; memory - paged = ; # yes / no + paged = ; # yes/no (flash only, do not use for EEPROM) + offset = ; # memory offset size = ; # bytes page_size = ; # bytes num_pages = ; # numeric min_write_delay = ; # micro-seconds max_write_delay = ; # micro-seconds - readback_p1 = ; # byte value - readback_p2 = ; # byte value - pwroff_after_write = ; # yes / no + readback = ; # pair of byte values + readback_p1 = ; # byte value (first component) + readback_p2 = ; # byte value (second component) + pwroff_after_write = ; # yes/no + mode = ; # STK500 v2 file parameter from Atmel's XML files + delay = ; # " + blocksize = ; # " + readsize = ; # " read = ; write = ; read_lo = ; @@ -1832,8 +1864,8 @@ part loadpage_lo = ; loadpage_hi = ; writepage = ; - ; - ; + ; +; @end smallexample @menu @@ -1914,7 +1946,22 @@ write = "1 1 0 0 0 0 0 0 x x x x x x x x", @end smallexample +As the address bit numbers in the SPI opcodes are highly systematic, they +don't really need to be specified. A compact version of the format +specification neither uses bit-numbers for address lines nor spaces. If such +a string is longer than 7 characters, then the characters @code{0}, @code{1}, +@code{x}, @code{a}, @code{i} and @code{o} will be recognised as the +corresponding bit, whilst any of the characters @code{.}, @code{-}, @code{_} +or @code{/} can act as arbitrary visual separators, which are ignored. +Examples: +@smallexample + + loadpage_lo = "0100.0000--000x.xxxx--xxaa.aaaa--iiii.iiii"; + + loadpage_lo = "0100.0000", "000x.xxxx", "xxaa.aaaa", "iiii.iiii"; + +@end smallexample @c @c Node diff --git a/src/lexer.l b/src/lexer.l index a69130d3..65b7a451 100644 --- a/src/lexer.l +++ b/src/lexer.l @@ -63,9 +63,9 @@ SIGN [+-] %% -{SIGN}?{DIGIT}+ { yylval = number(yytext); return TKN_NUMBER; } -{SIGN}?{DIGIT}+"."{DIGIT}* { yylval = number_real(yytext); return TKN_NUMBER_REAL; } -{SIGN}?"."{DIGIT}+ { yylval = number_real(yytext); return TKN_NUMBER_REAL; } +{SIGN}?{DIGIT}+ { yylval = new_number(yytext); return TKN_NUMBER; } +{SIGN}?{DIGIT}+"."{DIGIT}* { yylval = new_number_real(yytext); return TKN_NUMBER_REAL; } +{SIGN}?"."{DIGIT}+ { yylval = new_number_real(yytext); return TKN_NUMBER_REAL; } ["]([^"\\\n]|\\.|\\\n)*["] { char *str= cfg_strdup("lexer.l", yytext); @@ -73,12 +73,12 @@ SIGN [+-] size_t len = strlen(str); if(len) str[len-1] = 0; - yylval = string(str); + yylval = new_string(str); free(str); return TKN_STRING; } -0x{HEXDIGIT}+ { yylval = hexnumber(yytext); return TKN_NUMBER; } +0x{HEXDIGIT}+ { yylval = new_hexnumber(yytext); return TKN_NUMBER; } #\n#\ PROGRAMMER\ DEFINITIONS\n#\n+ { /* Record comments so far as prologue and skip */ cfg_capture_prologue(); @@ -121,6 +121,23 @@ SIGN [+-] } +prog_modes|mcuid|n_interrupts|n_page_erase { /* Components for assignment */ + Component_t *cp = cfg_comp_search(yytext, current_strct); + if(!cp) { + yyerror("Unknown component %s in %s", yytext, cfg_strct_name(current_strct)); + return YYERRCODE; + } + yylval = new_token(TKN_COMPONENT); + yylval->value.comp = cp; + ccap(); + return TKN_COMPONENT; +} + +PM_SPM|PM_TPI|PM_ISP|PM_PDI|PM_UPDI|PM_HVSP|PM_HVPP|PM_debugWIRE|PM_JTAG|PM_aWire { /* Constants */ + yylval = new_constant(yytext); + return TKN_NUMBER; +} + alias { yylval=NULL; return K_ALIAS; } allowfullpagebitstream { yylval=NULL; ccap(); return K_ALLOWFULLPAGEBITSTREAM; } avr910_devcode { yylval=NULL; ccap(); return K_AVR910_DEVCODE; } @@ -258,7 +275,17 @@ yes { yylval=new_token(K_YES); return K_YES; } "," { yylval = NULL; pyytext(); return TKN_COMMA; } "=" { yylval = NULL; pyytext(); return TKN_EQUAL; } ";" { yylval = NULL; pyytext(); return TKN_SEMI; } -"~" { yylval = NULL; pyytext(); return TKN_TILDE; } + +"|" { yylval = NULL; pyytext(); return OP_OR; } +"^" { yylval = NULL; pyytext(); return OP_XOR; } +"&" { yylval = NULL; pyytext(); return OP_AND; } +"+" { yylval = NULL; pyytext(); return OP_PLUS; } +"-" { yylval = NULL; pyytext(); return OP_MINUS; } +"*" { yylval = NULL; pyytext(); return OP_TIMES; } +"/" { yylval = NULL; pyytext(); return OP_DIVIDE; } +"%" { yylval = NULL; pyytext(); return OP_MODULO; } +"~" { yylval = NULL; pyytext(); return OP_TILDE; } + "(" { yylval = NULL; pyytext(); return TKN_LEFT_PAREN; } ")" { yylval = NULL; pyytext(); return TKN_RIGHT_PAREN; } diff --git a/src/libavrdude.h b/src/libavrdude.h index 9288b43b..c99117f4 100644 --- a/src/libavrdude.h +++ b/src/libavrdude.h @@ -169,6 +169,7 @@ enum ctl_stack_t { CTL_STACK_HVSP /* high voltage serial programming control stack */ }; + /* * serial programming instruction bit specifications */ @@ -197,6 +198,18 @@ typedef struct opcode { #define AVRPART_IS_AT90S1200 0x1000 /* part is an AT90S1200 (needs special treatment) */ #define AVRPART_HAS_UPDI 0x2000 /* part has UPDI i/f (AVR8X) */ +// Programming modes for parts and programmers: reflect changes in lexer.l, developer_opts.c and config.c +#define PM_SPM 1 // Bootloaders, self-programming with SPM opcodes or NVM Controllers +#define PM_TPI 2 // Tiny Programming Interface (t4, t5, t9, t10, t20, t40, t102, t104) +#define PM_ISP 4 // SPI programming for In-System Programming (almost all classic parts) +#define PM_PDI 8 // Program and Debug Interface (xmega parts) +#define PM_UPDI 16 // Unified Program and Debug Interface +#define PM_HVSP 32 // High Voltage Serial Programming (some classic parts) +#define PM_HVPP 64 // High Voltage Parallel Programming (most non-HVSP classic parts) +#define PM_debugWIRE 128 // Simpler alternative to JTAG (a subset of HVPP/HVSP parts) +#define PM_JTAG 256 // Joint Test Action Group standard (some classic parts, some xmega) +#define PM_aWire 512 // AVR32 parts + #define HV_UPDI_VARIANT_0 0 /* Shared UPDI/GPIO/RESET pin, HV on UPDI pin (tinyAVR0/1/2)*/ #define HV_UPDI_VARIANT_1 1 /* Dedicated UPDI pin, no HV (megaAVR0/AVR-Dx) */ #define HV_UPDI_VARIANT_2 2 /* Shared UPDI pin, HV on _RESET (AVR-Ex) */ @@ -209,13 +222,24 @@ typedef struct opcode { #define TAG_ALLOCATED 1 /* memory byte is allocated */ -/* Any changes here, please also reflect in dev_part_strct() of developer_opts.c */ +/* + * Any changes in AVRPART or AVRMEM, please also ensure changes are made in + * - lexer.l + * - Either Component_t avr_comp[] of config.c or in config_gram.y + * - dev_part_strct() in developer_opts.c + * - avr_new_part() and/or avr_new_memtype() in avrpart.c for + * initialisation; note that all const char * must be initialised with "" + */ typedef struct avrpart { const char * desc; /* long part name */ const char * id; /* short part name */ LISTID comments; // Used by developer options -p*/[ASsr...] const char * parent_id; /* Used by developer options */ const char * family_id; /* family id in the SIB (avr8x) */ + int prog_modes; /* Programming interfaces, see #define PM_... */ + int mcuid; /* Unique id in 0..2039 for urclock programmer */ + int n_interrupts; /* Number of interrupts, used for vector bootloaders */ + int n_page_erase; /* If set, number of pages erased during NVM erase */ int hvupdi_variant; /* HV pulse on UPDI pin, no pin or RESET pin */ int stk500_devcode; /* stk500 device code */ int avr910_devcode; /* avr910 device code */ @@ -262,7 +286,7 @@ typedef struct avrpart { int programlockpulsewidth; /* stk500 v2 hv mode parameter */ int programlockpolltimeout; /* stk500 v2 hv mode parameter */ int synchcycles; /* stk500 v2 hv mode parameter */ - int hvspcmdexedelay; /* stk500 v2 xml file parameter */ + int hvspcmdexedelay; /* stk500 v2 hv mode file parameter */ unsigned char idr; /* JTAG ICE mkII XML file parameter */ unsigned char rampz; /* JTAG ICE mkII XML file parameter */ @@ -677,13 +701,21 @@ typedef enum { CONNTYPE_SPI } conntype_t; -/* Any changes here, please also reflect in dev_pgm_strct() of developer_opts.c */ +/* + * Any changes in PROGRAMMER, please also ensure changes are made in + * - lexer.l + * - Either Component_t avr_comp[] of config.c or config_gram.y + * - dev_pgm_strct() in developer_opts.c + * - pgm_new() in pgm.c for initialisation; note that all const char * must + * be initialised with "" + */ typedef struct programmer_t { LISTID id; const char *desc; void (*initpgm)(struct programmer_t *pgm); // Sets up the AVRDUDE programmer LISTID comments; // Used by developer options -c*/[ASsr...] const char *parent_id; // Used by developer options + int prog_modes; // Programming interfaces, see #define PM_... struct pindef_t pin[N_PINS]; conntype_t conntype; int baudrate; @@ -695,7 +727,7 @@ typedef struct programmer_t { const char *usbproduct; LISTID hvupdi_support; // List of UPDI HV variants the tool supports, see HV_UPDI_VARIANT_x - // Values below are not set by config_gram.y; make sure fd is first for dev_pgm_raw() + // Values below are not set by config_gram.y; ensure fd is first for dev_pgm_raw() union filedescriptor fd; char type[PGM_TYPELEN]; char port[PGM_PORTLEN]; From 0df8b87eda02e089cf88fd775e492d2b894b20d2 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Tue, 30 Aug 2022 02:31:57 +0100 Subject: [PATCH 02/11] Set part prog_modes, mcuid, n_interrupts and n_page_erase in avrdude.conf.in --- src/avrdude.conf.in | 582 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 582 insertions(+) diff --git a/src/avrdude.conf.in b/src/avrdude.conf.in index e2a330ff..018850d3 100644 --- a/src/avrdude.conf.in +++ b/src/avrdude.conf.in @@ -2337,6 +2337,9 @@ programmer part desc = "ATtiny11"; id = "t11"; + prog_modes = PM_HVSP; + mcuid = 8; + n_interrupts = 5; stk500_devcode = 0x11; chip_erase_delay = 20000; signature = 0x1e 0x90 0x04; @@ -2397,6 +2400,9 @@ part part desc = "ATtiny12"; id = "t12"; + prog_modes = PM_ISP | PM_HVSP; + mcuid = 9; + n_interrupts = 6; stk500_devcode = 0x12; avr910_devcode = 0x55; chip_erase_delay = 20000; @@ -2490,6 +2496,9 @@ part part desc = "ATtiny13"; id = "t13"; + prog_modes = PM_SPM | PM_ISP | PM_HVSP | PM_debugWIRE; + mcuid = 10; + n_interrupts = 10; stk500_devcode = 0x14; chip_erase_delay = 4000; signature = 0x1e 0x90 0x07; @@ -2605,6 +2614,7 @@ part part parent "t13" desc = "ATtiny13A"; id = "t13a"; + mcuid = 11; ; #------------------------------------------------------------ @@ -2614,6 +2624,9 @@ part parent "t13" part desc = "ATtiny15"; id = "t15"; + prog_modes = PM_ISP | PM_HVSP; + mcuid = 12; + n_interrupts = 9; stk500_devcode = 0x13; avr910_devcode = 0x56; chip_erase_delay = 8200; @@ -2708,6 +2721,9 @@ part part desc = "AT90S1200"; id = "1200"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP; + mcuid = 183; + n_interrupts = 4; stk500_devcode = 0x33; avr910_devcode = 0x13; chip_erase_delay = 20000; @@ -2787,6 +2803,9 @@ part part desc = "AT90S4414"; id = "4414"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP; + mcuid = 190; + n_interrupts = 13; stk500_devcode = 0x50; avr910_devcode = 0x28; chip_erase_delay = 20000; @@ -2864,6 +2883,9 @@ part part desc = "AT90S2313"; id = "2313"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP; + mcuid = 186; + n_interrupts = 11; stk500_devcode = 0x40; avr910_devcode = 0x20; chip_erase_delay = 20000; @@ -2942,6 +2964,9 @@ part ##### WARNING: No XML file for device 'AT90S2333'! ##### desc = "AT90S2333"; id = "2333"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP; + mcuid = 188; + n_interrupts = 14; stk500_devcode = 0x42; avr910_devcode = 0x34; chip_erase_delay = 20000; @@ -3025,6 +3050,9 @@ part part desc = "AT90S2343"; id = "2343"; + prog_modes = PM_SPM | PM_ISP | PM_HVSP; + mcuid = 189; + n_interrupts = 3; stk500_devcode = 0x43; avr910_devcode = 0x4c; chip_erase_delay = 18000; @@ -3112,6 +3140,9 @@ part part desc = "AT90S4433"; id = "4433"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP; + mcuid = 191; + n_interrupts = 14; stk500_devcode = 0x51; avr910_devcode = 0x30; chip_erase_delay = 20000; @@ -3196,6 +3227,9 @@ part ##### WARNING: No XML file for device 'AT90S4434'! ##### desc = "AT90S4434"; id = "4434"; + prog_modes = PM_SPM | PM_ISP; + mcuid = 192; + n_interrupts = 17; stk500_devcode = 0x52; avr910_devcode = 0x6c; chip_erase_delay = 20000; @@ -3252,6 +3286,9 @@ part part desc = "AT90S8515"; id = "8515"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP; + mcuid = 193; + n_interrupts = 13; stk500_devcode = 0x60; avr910_devcode = 0x38; chip_erase_delay = 20000; @@ -3330,6 +3367,9 @@ part part desc = "AT90S8535"; id = "8535"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP; + mcuid = 195; + n_interrupts = 17; stk500_devcode = 0x61; avr910_devcode = 0x68; chip_erase_delay = 20000; @@ -3412,6 +3452,9 @@ part part desc = "ATmega103"; id = "m103"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP; + mcuid = 84; + n_interrupts = 24; stk500_devcode = 0xb1; avr910_devcode = 0x41; chip_erase_delay = 112000; @@ -3498,6 +3541,9 @@ part part desc = "ATmega64"; id = "m64"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 72; + n_interrupts = 35; stk500_devcode = 0xa0; avr910_devcode = 0x45; chip_erase_delay = 9000; @@ -3615,6 +3661,7 @@ part part parent "m64" desc = "ATmega64A"; id = "m64a"; + mcuid = 73; ; #------------------------------------------------------------ @@ -3624,6 +3671,9 @@ part parent "m64" part desc = "ATmega128"; id = "m128"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 85; + n_interrupts = 35; stk500_devcode = 0xb2; avr910_devcode = 0x43; chip_erase_delay = 9000; @@ -3742,6 +3792,7 @@ part part parent "m128" desc = "ATmega128A"; id = "m128a"; + mcuid = 86; ; #------------------------------------------------------------ @@ -3751,6 +3802,9 @@ part parent "m128" part desc = "AT90CAN128"; id = "c128"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 176; + n_interrupts = 37; stk500_devcode = 0xb3; chip_erase_delay = 9000; pagel = 0xd7; @@ -3872,6 +3926,9 @@ part part desc = "AT90CAN64"; id = "c64"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 172; + n_interrupts = 37; stk500_devcode = 0xb3; chip_erase_delay = 9000; pagel = 0xd7; @@ -3993,6 +4050,9 @@ part part desc = "AT90CAN32"; id = "c32"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 171; + n_interrupts = 37; stk500_devcode = 0xb3; chip_erase_delay = 9000; pagel = 0xd7; @@ -4114,6 +4174,9 @@ part part desc = "ATmega16"; id = "m16"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 49; + n_interrupts = 21; stk500_devcode = 0x82; avr910_devcode = 0x74; chip_erase_delay = 9000; @@ -4227,6 +4290,7 @@ part part parent "m16" desc = "ATmega16A"; id = "m16a"; + mcuid = 50; ; #------------------------------------------------------------ @@ -4236,6 +4300,9 @@ part parent "m16" part desc = "ATmega324P"; id = "m324p"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 111; + n_interrupts = 31; stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one avr910_devcode = 0x74; chip_erase_delay = 55000; @@ -4357,6 +4424,7 @@ part part parent "m324p" desc = "ATmega164P"; id = "m164p"; + mcuid = 93; signature = 0x1e 0x94 0x0a; memory "eeprom" @@ -4376,6 +4444,7 @@ part parent "m324p" part parent "m164p" desc = "ATmega164PA"; id = "m164pa"; + mcuid = 94; ; #------------------------------------------------------------ @@ -4385,6 +4454,7 @@ part parent "m164p" part parent "m164p" desc = "ATmega164A"; id = "m164a"; + mcuid = 92; signature = 0x1e 0x94 0x0f; ; @@ -4395,6 +4465,7 @@ part parent "m164p" part parent "m324p" desc = "ATmega324PB"; id = "m324pb"; + mcuid = 113; signature = 0x1e 0x95 0x17; ; @@ -4405,6 +4476,7 @@ part parent "m324p" part parent "m324p" desc = "ATmega324PA"; id = "m324pa"; + mcuid = 112; signature = 0x1e 0x95 0x11; ; @@ -4415,6 +4487,7 @@ part parent "m324p" part parent "m324p" desc = "ATmega324A"; id = "m324a"; + mcuid = 110; signature = 0x1e 0x95 0x15; ; @@ -4425,6 +4498,9 @@ part parent "m324p" part desc = "ATmega644"; id = "m644"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 127; + n_interrupts = 28; stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one avr910_devcode = 0x74; chip_erase_delay = 55000; @@ -4543,6 +4619,8 @@ part part parent "m644" desc = "ATmega644A"; id = "m644a"; + mcuid = 128; + n_interrupts = 31; ; #------------------------------------------------------------ @@ -4552,6 +4630,8 @@ part parent "m644" part parent "m644" desc = "ATmega644P"; id = "m644p"; + mcuid = 129; + n_interrupts = 31; signature = 0x1e 0x96 0x0a; ; @@ -4562,6 +4642,8 @@ part parent "m644" part parent "m644" desc = "ATmega644PA"; id = "m644pa"; + mcuid = 130; + n_interrupts = 31; signature = 0x1e 0x96 0x0a; ; @@ -4572,6 +4654,9 @@ part parent "m644" part desc = "ATmega1284"; id = "m1284"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 140; + n_interrupts = 35; stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one avr910_devcode = 0x74; chip_erase_delay = 55000; @@ -4694,6 +4779,7 @@ part part parent "m1284" desc = "ATmega1284P"; id = "m1284p"; + mcuid = 141; signature = 0x1e 0x97 0x05; ; @@ -4704,6 +4790,9 @@ part parent "m1284" part desc = "ATmega162"; id = "m162"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 90; + n_interrupts = 28; stk500_devcode = 0x83; avr910_devcode = 0x63; chip_erase_delay = 9000; @@ -4823,6 +4912,9 @@ part part desc = "ATmega163"; id = "m163"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP; + mcuid = 91; + n_interrupts = 18; stk500_devcode = 0x81; avr910_devcode = 0x64; chip_erase_delay = 32000; @@ -4924,6 +5016,9 @@ part part desc = "ATmega169"; id = "m169"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 104; + n_interrupts = 23; stk500_devcode = 0x85; avr910_devcode = 0x78; chip_erase_delay = 9000; @@ -5043,6 +5138,7 @@ part part parent "m169" desc = "ATmega169A"; id = "m169a"; + mcuid = 105; signature = 0x1e 0x94 0x11; reset = io; ; @@ -5054,6 +5150,7 @@ part parent "m169" part parent "m169" desc = "ATmega169P"; id = "m169p"; + mcuid = 106; reset = io; ; @@ -5064,6 +5161,7 @@ part parent "m169" part parent "m169" desc = "ATmega169PA"; id = "m169pa"; + mcuid = 107; reset = io; ; @@ -5074,6 +5172,9 @@ part parent "m169" part desc = "ATmega329"; id = "m329"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 121; + n_interrupts = 23; # stk500_devcode = 0x85; # no STK500 support, only STK500v2 # avr910_devcode = 0x?; # try the ATmega169 one: avr910_devcode = 0x75; @@ -5195,6 +5296,7 @@ part part parent "m329" desc = "ATmega329A"; id = "m329a"; + mcuid = 122; ; #------------------------------------------------------------ @@ -5204,6 +5306,7 @@ part parent "m329" part parent "m329" desc = "ATmega329P"; id = "m329p"; + mcuid = 123; signature = 0x1e 0x95 0x0b; ; @@ -5214,6 +5317,7 @@ part parent "m329" part parent "m329" desc = "ATmega329PA"; id = "m329pa"; + mcuid = 124; signature = 0x1e 0x95 0x0b; ; @@ -5224,6 +5328,8 @@ part parent "m329" part parent "m329" desc = "ATmega3290"; id = "m3290"; + mcuid = 150; + n_interrupts = 25; signature = 0x1e 0x95 0x04; ; @@ -5234,6 +5340,8 @@ part parent "m329" part parent "m329" desc = "ATmega3290A"; id = "m3290a"; + mcuid = 151; + n_interrupts = 25; signature = 0x1e 0x95 0x04; ; @@ -5244,6 +5352,8 @@ part parent "m329" part parent "m329" desc = "ATmega3290P"; id = "m3290p"; + mcuid = 152; + n_interrupts = 25; signature = 0x1e 0x95 0x0c; ; @@ -5254,6 +5364,8 @@ part parent "m329" part parent "m329" desc = "ATmega3290PA"; id = "m3290pa"; + mcuid = 153; + n_interrupts = 25; signature = 0x1e 0x95 0x0c; ; @@ -5264,6 +5376,9 @@ part parent "m329" part desc = "ATmega649"; id = "m649"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 135; + n_interrupts = 23; # stk500_devcode = 0x85; # no STK500 support, only STK500v2 # avr910_devcode = 0x?; # try the ATmega169 one: avr910_devcode = 0x75; @@ -5385,6 +5500,7 @@ part part parent "m649" desc = "ATmega649A"; id = "m649a"; + mcuid = 136; ; #------------------------------------------------------------ @@ -5394,6 +5510,7 @@ part parent "m649" part parent "m649" desc = "ATmega649P"; id = "m649p"; + mcuid = 137; signature = 0x1e 0x96 0x0b; ; @@ -5404,6 +5521,8 @@ part parent "m649" part parent "m649" desc = "ATmega6490"; id = "m6490"; + mcuid = 157; + n_interrupts = 25; signature = 0x1e 0x96 0x04; ; @@ -5414,6 +5533,8 @@ part parent "m649" part parent "m649" desc = "ATmega6490A"; id = "m6490a"; + mcuid = 158; + n_interrupts = 25; signature = 0x1e 0x96 0x04; ; @@ -5424,6 +5545,8 @@ part parent "m649" part parent "m649" desc = "ATmega6490P"; id = "m6490p"; + mcuid = 159; + n_interrupts = 25; signature = 0x1e 0x96 0x0c; ; @@ -5434,6 +5557,9 @@ part parent "m649" part desc = "ATmega32"; id = "m32"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 58; + n_interrupts = 21; stk500_devcode = 0x91; avr910_devcode = 0x72; chip_erase_delay = 9000; @@ -5545,6 +5671,9 @@ part part desc = "ATmega161"; id = "m161"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP; + mcuid = 89; + n_interrupts = 21; stk500_devcode = 0x80; avr910_devcode = 0x60; chip_erase_delay = 28000; @@ -5633,6 +5762,7 @@ part part parent "m32" desc = "ATmega32A"; id = "m32a"; + mcuid = 59; ; #------------------------------------------------------------ @@ -5642,6 +5772,9 @@ part parent "m32" part desc = "ATmega8"; id = "m8"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP; + mcuid = 45; + n_interrupts = 19; stk500_devcode = 0x70; avr910_devcode = 0x76; chip_erase_delay = 10000; @@ -5750,6 +5883,7 @@ part part parent "m8" desc = "ATmega8A"; id = "m8a"; + mcuid = 46; ; #------------------------------------------------------------ @@ -5759,6 +5893,9 @@ part parent "m8" part desc = "ATmega8515"; id = "m8515"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP; + mcuid = 160; + n_interrupts = 17; stk500_devcode = 0x63; avr910_devcode = 0x3a; chip_erase_delay = 9000; @@ -5859,6 +5996,9 @@ part part desc = "ATmega8535"; id = "m8535"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP; + mcuid = 161; + n_interrupts = 21; stk500_devcode = 0x64; avr910_devcode = 0x69; chip_erase_delay = 9000; @@ -5961,6 +6101,9 @@ part part desc = "ATtiny26"; id = "t26"; + prog_modes = PM_ISP | PM_HVPP; + mcuid = 17; + n_interrupts = 12; stk500_devcode = 0x21; avr910_devcode = 0x5e; chip_erase_delay = 9000; @@ -6066,6 +6209,9 @@ part part desc = "ATtiny261"; id = "t261"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 30; + n_interrupts = 19; chip_erase_delay = 4000; pagel = 0xb3; bs2 = 0xb2; @@ -6190,6 +6336,7 @@ part part parent "t261" desc = "ATtiny261A"; id = "t261a"; + mcuid = 31; ; #------------------------------------------------------------ @@ -6199,6 +6346,9 @@ part parent "t261" part desc = "ATtiny461"; id = "t461"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 33; + n_interrupts = 19; chip_erase_delay = 4000; pagel = 0xb3; bs2 = 0xb2; @@ -6323,6 +6473,7 @@ part part parent "t461" desc = "ATtiny461A"; id = "t461a"; + mcuid = 34; ; #------------------------------------------------------------ @@ -6332,6 +6483,9 @@ part parent "t461" part desc = "ATtiny861"; id = "t861"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 38; + n_interrupts = 19; chip_erase_delay = 4000; pagel = 0xb3; bs2 = 0xb2; @@ -6456,6 +6610,7 @@ part part parent "t861" desc = "ATtiny861A"; id = "t861a"; + mcuid = 39; ; #------------------------------------------------------------ @@ -6467,6 +6622,9 @@ part parent "t861" part desc = "ATtiny28"; id = "t28"; + prog_modes = PM_HVPP; + mcuid = 18; + n_interrupts = 6; stk500_devcode = 0x22; avr910_devcode = 0x5c; signature = 0x1e 0x91 0x07; @@ -6514,6 +6672,9 @@ part part desc = "ATmega48"; id = "m48"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 67; + n_interrupts = 26; stk500_devcode = 0x59; chip_erase_delay = 45000; pagel = 0xd7; @@ -6639,6 +6800,7 @@ part part parent "m48" desc = "ATmega48A"; id = "m48a"; + mcuid = 68; ; #------------------------------------------------------------ @@ -6648,6 +6810,7 @@ part parent "m48" part parent "m48" desc = "ATmega48P"; id = "m48p"; + mcuid = 69; signature = 0x1e 0x92 0x0a; ; @@ -6658,6 +6821,7 @@ part parent "m48" part parent "m48" desc = "ATmega48PA"; id = "m48pa"; + mcuid = 70; signature = 0x1e 0x92 0x0a; ; @@ -6668,6 +6832,8 @@ part parent "m48" part parent "m48" desc = "ATmega48PB"; id = "m48pb"; + mcuid = 71; + n_interrupts = 27; chip_erase_delay = 10500; signature = 0x1e 0x92 0x10; ; @@ -6679,6 +6845,9 @@ part parent "m48" part desc = "ATmega88"; id = "m88"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 79; + n_interrupts = 26; stk500_devcode = 0x73; chip_erase_delay = 9000; pagel = 0xd7; @@ -6805,6 +6974,7 @@ part part parent "m88" desc = "ATmega88A"; id = "m88a"; + mcuid = 80; ; #------------------------------------------------------------ @@ -6814,6 +6984,7 @@ part parent "m88" part parent "m88" desc = "ATmega88P"; id = "m88p"; + mcuid = 81; signature = 0x1e 0x93 0x0f; ; @@ -6824,6 +6995,7 @@ part parent "m88" part parent "m88" desc = "ATmega88PA"; id = "m88pa"; + mcuid = 82; signature = 0x1e 0x93 0x0f; ; @@ -6834,6 +7006,8 @@ part parent "m88" part parent "m88" desc = "ATmega88PB"; id = "m88pb"; + mcuid = 83; + n_interrupts = 27; chip_erase_delay = 10500; signature = 0x1e 0x93 0x16; ; @@ -6845,6 +7019,9 @@ part parent "m88" part desc = "ATmega168"; id = "m168"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 99; + n_interrupts = 26; stk500_devcode = 0x86; chip_erase_delay = 9000; pagel = 0xd7; @@ -6971,6 +7148,7 @@ part part parent "m168" desc = "ATmega168A"; id = "m168a"; + mcuid = 100; ; #------------------------------------------------------------ @@ -6980,6 +7158,7 @@ part parent "m168" part parent "m168" desc = "ATmega168P"; id = "m168p"; + mcuid = 101; signature = 0x1e 0x94 0x0b; ; @@ -6990,6 +7169,7 @@ part parent "m168" part parent "m168" desc = "ATmega168PA"; id = "m168pa"; + mcuid = 102; signature = 0x1e 0x94 0x0b; ; @@ -7000,6 +7180,8 @@ part parent "m168" part parent "m168" desc = "ATmega168PB"; id = "m168pb"; + mcuid = 103; + n_interrupts = 27; chip_erase_delay = 10500; signature = 0x1e 0x94 0x15; ; @@ -7011,6 +7193,9 @@ part parent "m168" part desc = "ATtiny828"; id = "t828"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 35; + n_interrupts = 26; stk500_devcode = 0x86; chip_erase_delay = 15000; pagel = 0xd7; @@ -7136,6 +7321,7 @@ part part parent "t828" desc = "ATtiny828R"; id = "t828r"; + mcuid = 36; ; #------------------------------------------------------------ @@ -7145,6 +7331,9 @@ part parent "t828" part desc = "ATtiny87"; id = "t87"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 27; + n_interrupts = 20; # no STK500 devcode in XML file, use the ATtiny45 one stk500_devcode = 0x14; # Try the AT90S2313 devcode: @@ -7269,6 +7458,9 @@ part part desc = "ATtiny167"; id = "t167"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 29; + n_interrupts = 20; # no STK500 devcode in XML file, use the ATtiny45 one stk500_devcode = 0x14; # avr910_devcode = 0x??; @@ -7394,6 +7586,9 @@ part part desc = "ATtiny48"; id = "t48"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 23; + n_interrupts = 20; stk500_devcode = 0x73; chip_erase_delay = 15000; pagel = 0xd7; @@ -7520,6 +7715,9 @@ part part desc = "ATtiny88"; id = "t88"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 28; + n_interrupts = 20; stk500_devcode = 0x73; chip_erase_delay = 9000; pagel = 0xd7; @@ -7646,6 +7844,9 @@ part part desc = "ATmega328"; id = "m328"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 118; + n_interrupts = 26; stk500_devcode = 0x86; chip_erase_delay = 9000; pagel = 0xd7; @@ -7772,6 +7973,7 @@ part part parent "m328" desc = "ATmega328P"; id = "m328p"; + mcuid = 119; signature = 0x1e 0x95 0x0f; ; @@ -7782,6 +7984,8 @@ part parent "m328" part parent "m328" desc = "ATmega328PB"; id = "m328pb"; + mcuid = 120; + n_interrupts = 45; chip_erase_delay = 10500; signature = 0x1e 0x95 0x16; @@ -7797,6 +8001,8 @@ part parent "m328" part parent "m328" desc = "ATmega32M1"; id = "m32m1"; + mcuid = 63; + n_interrupts = 31; bs2 = 0xe2; # stk500_devcode = 0x??; # avr910_devcode = 0x??; @@ -7814,6 +8020,8 @@ part parent "m328" part parent "m328" desc = "ATmega64M1"; id = "m64m1"; + mcuid = 76; + n_interrupts = 31; bs2 = 0xe2; # stk500_devcode = 0x??; # avr910_devcode = 0x??; @@ -7850,6 +8058,9 @@ part parent "m328" part desc = "ATtiny2313"; id = "t2313"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 42; + n_interrupts = 19; stk500_devcode = 0x23; # Use the ATtiny26 devcode: avr910_devcode = 0x5e; @@ -7981,6 +8192,8 @@ part part parent "t2313" desc = "ATtiny2313A"; id = "t2313a"; + mcuid = 43; + n_interrupts = 21; ; #------------------------------------------------------------ @@ -7990,6 +8203,9 @@ part parent "t2313" part desc = "ATtiny4313"; id = "t4313"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 44; + n_interrupts = 21; stk500_devcode = 0x23; # Use the ATtiny26 devcode: avr910_devcode = 0x5e; @@ -8116,6 +8332,9 @@ part part desc = "AT90PWM2"; id = "pwm2"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 167; + n_interrupts = 32; stk500_devcode = 0x65; chip_erase_delay = 9000; pagel = 0xd8; @@ -8242,6 +8461,7 @@ part part parent "pwm2" desc = "AT90PWM3"; id = "pwm3"; + mcuid = 169; ; #------------------------------------------------------------ @@ -8252,6 +8472,7 @@ part parent "pwm2" part parent "pwm2" desc = "AT90PWM2B"; id = "pwm2b"; + mcuid = 168; signature = 0x1e 0x93 0x83; ocdrev = 1; ; @@ -8265,6 +8486,7 @@ part parent "pwm2" part parent "pwm2b" desc = "AT90PWM3B"; id = "pwm3b"; + mcuid = 170; ; #------------------------------------------------------------ @@ -8276,6 +8498,7 @@ part parent "pwm2b" part parent "pwm3b" desc = "AT90PWM316"; id = "pwm316"; + mcuid = 180; signature = 0x1e 0x94 0x83; memory "flash" @@ -8299,6 +8522,7 @@ part parent "pwm3b" part parent "pwm316" desc = "AT90PWM216"; id = "pwm216"; + mcuid = 179; ; #------------------------------------------------------------ @@ -8308,6 +8532,9 @@ part parent "pwm316" part desc = "ATtiny25"; id = "t25"; + prog_modes = PM_SPM | PM_ISP | PM_HVSP | PM_debugWIRE; + mcuid = 16; + n_interrupts = 15; # no STK500 devcode in XML file, use the ATtiny45 one stk500_devcode = 0x14; # avr910_devcode = ?; @@ -8436,6 +8663,9 @@ part part desc = "ATtiny45"; id = "t45"; + prog_modes = PM_SPM | PM_ISP | PM_HVSP | PM_debugWIRE; + mcuid = 22; + n_interrupts = 15; stk500_devcode = 0x14; # avr910_devcode = ?; # Try the AT90S2313 devcode: @@ -8563,6 +8793,9 @@ part part desc = "ATtiny85"; id = "t85"; + prog_modes = PM_SPM | PM_ISP | PM_HVSP | PM_debugWIRE; + mcuid = 26; + n_interrupts = 15; # no STK500 devcode in XML file, use the ATtiny45 one stk500_devcode = 0x14; # avr910_devcode = ?; @@ -8692,6 +8925,9 @@ part part desc = "ATmega640"; id = "m640"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 126; + n_interrupts = 57; # stk500_devcode = 0xB2; # avr910_devcode = 0x43; chip_erase_delay = 9000; @@ -8813,6 +9049,9 @@ part part desc = "ATmega1280"; id = "m1280"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 138; + n_interrupts = 57; # stk500_devcode = 0xB2; # avr910_devcode = 0x43; chip_erase_delay = 9000; @@ -8935,6 +9174,8 @@ part part parent "m1280" desc = "ATmega1281"; id = "m1281"; + mcuid = 139; + n_interrupts = 51; signature = 0x1e 0x97 0x04; ; @@ -8945,6 +9186,9 @@ part parent "m1280" part desc = "ATmega2560"; id = "m2560"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 143; + n_interrupts = 57; stk500_devcode = 0xb2; # avr910_devcode = 0x43; chip_erase_delay = 9000; @@ -9067,6 +9311,8 @@ part part parent "m2560" desc = "ATmega2561"; id = "m2561"; + mcuid = 144; + n_interrupts = 51; signature = 0x1e 0x98 0x02; ; @@ -9078,6 +9324,8 @@ part parent "m2560" part parent "m2561" desc = "ATmega128RFA1"; id = "m128rfa1"; + mcuid = 87; + n_interrupts = 72; chip_erase_delay = 55000; bs2 = 0xe2; signature = 0x1e 0xa7 0x01; @@ -9100,6 +9348,8 @@ part parent "m2561" part parent "m2561" desc = "ATmega256RFR2"; id = "m256rfr2"; + mcuid = 108; + n_interrupts = 77; chip_erase_delay = 18500; bs2 = 0xe2; signature = 0x1e 0xa8 0x02; @@ -9121,6 +9371,8 @@ part parent "m2561" part parent "m128rfa1" desc = "ATmega128RFR2"; id = "m128rfr2"; + mcuid = 88; + n_interrupts = 77; signature = 0x1e 0xa7 0x02; ; @@ -9131,6 +9383,8 @@ part parent "m128rfa1" part parent "m128rfa1" desc = "ATmega64RFR2"; id = "m64rfr2"; + mcuid = 78; + n_interrupts = 77; signature = 0x1e 0xa6 0x02; memory "eeprom" @@ -9158,6 +9412,7 @@ part parent "m128rfa1" part parent "m256rfr2" desc = "ATmega2564RFR2"; id = "m2564rfr2"; + mcuid = 145; signature = 0x1e 0xa8 0x03; ; @@ -9168,6 +9423,7 @@ part parent "m256rfr2" part parent "m128rfr2" desc = "ATmega1284RFR2"; id = "m1284rfr2"; + mcuid = 142; signature = 0x1e 0xa7 0x03; ; @@ -9178,6 +9434,7 @@ part parent "m128rfr2" part parent "m64rfr2" desc = "ATmega644RFR2"; id = "m644rfr2"; + mcuid = 131; signature = 0x1e 0xa6 0x03; ; @@ -9188,6 +9445,9 @@ part parent "m64rfr2" part desc = "ATtiny24"; id = "t24"; + prog_modes = PM_SPM | PM_ISP | PM_HVSP | PM_debugWIRE; + mcuid = 14; + n_interrupts = 17; # no STK500 devcode in XML file, use the ATtiny45 one stk500_devcode = 0x14; # avr910_devcode = ?; @@ -9316,6 +9576,7 @@ part part parent "t24" desc = "ATtiny24A"; id = "t24a"; + mcuid = 15; ; #------------------------------------------------------------ @@ -9325,6 +9586,9 @@ part parent "t24" part desc = "ATtiny44"; id = "t44"; + prog_modes = PM_SPM | PM_ISP | PM_HVSP | PM_debugWIRE; + mcuid = 20; + n_interrupts = 17; # no STK500 devcode in XML file, use the ATtiny45 one stk500_devcode = 0x14; # avr910_devcode = ?; @@ -9453,6 +9717,7 @@ part part parent "t44" desc = "ATtiny44A"; id = "t44a"; + mcuid = 21; ; #------------------------------------------------------------ @@ -9462,6 +9727,9 @@ part parent "t44" part desc = "ATtiny84"; id = "t84"; + prog_modes = PM_SPM | PM_ISP | PM_HVSP | PM_debugWIRE; + mcuid = 24; + n_interrupts = 17; # no STK500 devcode in XML file, use the ATtiny45 one stk500_devcode = 0x14; # avr910_devcode = ?; @@ -9590,6 +9858,7 @@ part part parent "t84" desc = "ATtiny84A"; id = "t84a"; + mcuid = 25; ; #------------------------------------------------------------ @@ -9599,6 +9868,9 @@ part parent "t84" part parent "t44" desc = "ATtiny441"; id = "t441"; + mcuid = 32; + n_interrupts = 30; + n_page_erase = 4; signature = 0x1e 0x92 0x15; memory "flash" @@ -9622,6 +9894,9 @@ part parent "t44" part parent "t84" desc = "ATtiny841"; id = "t841"; + mcuid = 37; + n_interrupts = 30; + n_page_erase = 4; signature = 0x1e 0x93 0x15; memory "flash" @@ -9645,6 +9920,9 @@ part parent "t84" part desc = "ATtiny43U"; id = "t43u"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 19; + n_interrupts = 16; stk500_devcode = 0x14; # avr910_devcode = ?; # Try the AT90S2313 devcode: @@ -9772,6 +10050,9 @@ part part desc = "ATmega16U4"; id = "m16u4"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 57; + n_interrupts = 43; # stk500_devcode = 0xB2; # avr910_devcode = 0x43; chip_erase_delay = 9000; @@ -9894,6 +10175,9 @@ part part desc = "ATmega32U4"; id = "m32u4"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 65; + n_interrupts = 43; # stk500_devcode = 0xB2; # avr910_devcode = 0x43; chip_erase_delay = 9000; @@ -10016,6 +10300,9 @@ part part desc = "AT90USB646"; id = "usb646"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 181; + n_interrupts = 38; # stk500_devcode = 0xB2; # avr910_devcode = 0x43; chip_erase_delay = 9000; @@ -10139,6 +10426,7 @@ part part parent "usb646" desc = "AT90USB647"; id = "usb647"; + mcuid = 182; ; #------------------------------------------------------------ @@ -10148,6 +10436,9 @@ part parent "usb646" part desc = "AT90USB1286"; id = "usb1286"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 184; + n_interrupts = 38; # stk500_devcode = 0xB2; # avr910_devcode = 0x43; chip_erase_delay = 9000; @@ -10271,6 +10562,7 @@ part part parent "usb1286" desc = "AT90USB1287"; id = "usb1287"; + mcuid = 185; ; #------------------------------------------------------------ @@ -10280,6 +10572,9 @@ part parent "usb1286" part desc = "AT90USB162"; id = "usb162"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 178; + n_interrupts = 29; chip_erase_delay = 9000; pagel = 0xd7; bs2 = 0xc6; @@ -10398,6 +10693,9 @@ part part desc = "AT90USB82"; id = "usb82"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 174; + n_interrupts = 58; chip_erase_delay = 9000; pagel = 0xd7; bs2 = 0xc6; @@ -10516,6 +10814,9 @@ part part desc = "ATmega32U2"; id = "m32u2"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 64; + n_interrupts = 29; chip_erase_delay = 9000; pagel = 0xd7; bs2 = 0xc6; @@ -10634,6 +10935,9 @@ part part desc = "ATmega16U2"; id = "m16u2"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 56; + n_interrupts = 29; chip_erase_delay = 9000; pagel = 0xd7; bs2 = 0xc6; @@ -10752,6 +11056,9 @@ part part desc = "ATmega8U2"; id = "m8u2"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 48; + n_interrupts = 58; chip_erase_delay = 9000; pagel = 0xd7; bs2 = 0xc6; @@ -10870,6 +11177,9 @@ part part desc = "ATmega165"; id = "m165"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 95; + n_interrupts = 22; # stk500_devcode = 0x??; # avr910_devcode = 0x??; chip_erase_delay = 9000; @@ -10990,6 +11300,7 @@ part part parent "m165" desc = "ATmega165A"; id = "m165a"; + mcuid = 96; ; #------------------------------------------------------------ @@ -10999,6 +11310,7 @@ part parent "m165" part parent "m165" desc = "ATmega165P"; id = "m165p"; + mcuid = 97; signature = 0x1e 0x94 0x07; ; @@ -11009,6 +11321,7 @@ part parent "m165" part parent "m165" desc = "ATmega165PA"; id = "m165pa"; + mcuid = 98; signature = 0x1e 0x94 0x07; ; @@ -11019,6 +11332,9 @@ part parent "m165" part desc = "ATmega325"; id = "m325"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 114; + n_interrupts = 23; # stk500_devcode = 0x??; # No STK500v1 support? # avr910_devcode = 0x??; # Try the ATmega16 one avr910_devcode = 0x74; @@ -11142,6 +11458,7 @@ part part parent "m325" desc = "ATmega325A"; id = "m325a"; + mcuid = 115; ; #------------------------------------------------------------ @@ -11151,6 +11468,7 @@ part parent "m325" part parent "m325" desc = "ATmega325P"; id = "m325p"; + mcuid = 116; signature = 0x1e 0x95 0x0d; ; @@ -11161,6 +11479,8 @@ part parent "m325" part parent "m325" desc = "ATmega325PA"; id = "m325pa"; + mcuid = 117; + n_interrupts = 22; signature = 0x1e 0x95 0x0d; ; @@ -11171,6 +11491,9 @@ part parent "m325" part desc = "ATmega645"; id = "m645"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_JTAG; + mcuid = 132; + n_interrupts = 23; # stk500_devcode = 0x??; # No STK500v1 support? # avr910_devcode = 0x??; # Try the ATmega16 one avr910_devcode = 0x74; @@ -11294,6 +11617,7 @@ part part parent "m645" desc = "ATmega645A"; id = "m645a"; + mcuid = 133; ; #------------------------------------------------------------ @@ -11303,6 +11627,7 @@ part parent "m645" part parent "m645" desc = "ATmega645P"; id = "m645p"; + mcuid = 134; signature = 0x1e 0x96 0x0d; ; @@ -11313,6 +11638,8 @@ part parent "m645" part parent "m325" desc = "ATmega3250"; id = "m3250"; + mcuid = 146; + n_interrupts = 25; signature = 0x1e 0x95 0x06; ; @@ -11323,6 +11650,8 @@ part parent "m325" part parent "m325" desc = "ATmega3250A"; id = "m3250a"; + mcuid = 147; + n_interrupts = 25; signature = 0x1e 0x95 0x06; ; @@ -11333,6 +11662,8 @@ part parent "m325" part parent "m325" desc = "ATmega3250P"; id = "m3250p"; + mcuid = 148; + n_interrupts = 25; signature = 0x1e 0x95 0x0e; ; @@ -11343,6 +11674,8 @@ part parent "m325" part parent "m325" desc = "ATmega3250PA"; id = "m3250pa"; + mcuid = 149; + n_interrupts = 25; signature = 0x1e 0x95 0x0e; ; @@ -11353,6 +11686,8 @@ part parent "m325" part parent "m645" desc = "ATmega6450"; id = "m6450"; + mcuid = 154; + n_interrupts = 25; signature = 0x1e 0x96 0x06; ; @@ -11363,6 +11698,8 @@ part parent "m645" part parent "m645" desc = "ATmega6450A"; id = "m6450a"; + mcuid = 155; + n_interrupts = 25; signature = 0x1e 0x96 0x06; ; @@ -11373,6 +11710,8 @@ part parent "m645" part parent "m645" desc = "ATmega6450P"; id = "m6450p"; + mcuid = 156; + n_interrupts = 25; signature = 0x1e 0x96 0x0e; ; @@ -11383,6 +11722,7 @@ part parent "m645" part desc = "AVR XMEGA family common values"; id = ".xmega"; + prog_modes = PM_SPM | PM_PDI; has_pdi = yes; mcu_base = 0x0090; nvm_base = 0x01c0; @@ -11437,6 +11777,8 @@ part part parent ".xmega" desc = "ATxmega16A4U"; id = "x16a4u"; + mcuid = 232; + n_interrupts = 127; signature = 0x1e 0x94 0x41; usbpid = 0x2fe3; @@ -11490,6 +11832,7 @@ part parent ".xmega" part parent "x16a4u" desc = "ATxmega16C4"; id = "x16c4"; + mcuid = 233; signature = 0x1e 0x94 0x43; ; @@ -11500,6 +11843,8 @@ part parent "x16a4u" part parent "x16a4u" desc = "ATxmega16D4"; id = "x16d4"; + mcuid = 234; + n_interrupts = 91; signature = 0x1e 0x94 0x42; ; @@ -11510,6 +11855,8 @@ part parent "x16a4u" part parent "x16a4u" desc = "ATxmega16A4"; id = "x16a4"; + mcuid = 231; + n_interrupts = 94; memory "fuse0" size = 1; @@ -11524,6 +11871,8 @@ part parent "x16a4u" part parent ".xmega" desc = "ATxmega32A4U"; id = "x32a4u"; + mcuid = 239; + n_interrupts = 127; signature = 0x1e 0x95 0x41; usbpid = 0x2fe4; @@ -11577,6 +11926,7 @@ part parent ".xmega" part parent "x32a4u" desc = "ATxmega32C4"; id = "x32c4"; + mcuid = 240; signature = 0x1e 0x95 0x44; ; @@ -11587,6 +11937,8 @@ part parent "x32a4u" part parent "x32a4u" desc = "ATxmega32D4"; id = "x32d4"; + mcuid = 241; + n_interrupts = 91; signature = 0x1e 0x95 0x42; ; @@ -11597,6 +11949,8 @@ part parent "x32a4u" part parent "x32a4u" desc = "ATxmega32A4"; id = "x32a4"; + mcuid = 238; + n_interrupts = 94; memory "fuse0" size = 1; @@ -11611,6 +11965,8 @@ part parent "x32a4u" part parent ".xmega" desc = "ATxmega64A4U"; id = "x64a4u"; + mcuid = 252; + n_interrupts = 127; signature = 0x1e 0x96 0x46; usbpid = 0x2fe5; @@ -11664,6 +12020,7 @@ part parent ".xmega" part parent "x64a4u" desc = "ATxmega64C3"; id = "x64c3"; + mcuid = 249; signature = 0x1e 0x96 0x49; usbpid = 0x2fd6; ; @@ -11675,6 +12032,8 @@ part parent "x64a4u" part parent "x64a4u" desc = "ATxmega64D3"; id = "x64d3"; + mcuid = 250; + n_interrupts = 114; signature = 0x1e 0x96 0x4a; ; @@ -11685,6 +12044,8 @@ part parent "x64a4u" part parent "x64a4u" desc = "ATxmega64D4"; id = "x64d4"; + mcuid = 253; + n_interrupts = 91; signature = 0x1e 0x96 0x47; ; @@ -11695,6 +12056,9 @@ part parent "x64a4u" part parent "x64a4u" desc = "ATxmega64A1"; id = "x64a1"; + prog_modes = PM_SPM | PM_PDI | PM_JTAG; + mcuid = 243; + n_interrupts = 125; signature = 0x1e 0x96 0x4e; has_jtag = yes; @@ -11711,6 +12075,8 @@ part parent "x64a4u" part parent "x64a1" desc = "ATxmega64A1U"; id = "x64a1u"; + mcuid = 244; + n_interrupts = 127; usbpid = 0x2fe8; ; @@ -11721,6 +12087,8 @@ part parent "x64a1" part parent "x64a1" desc = "ATxmega64A3"; id = "x64a3"; + mcuid = 246; + n_interrupts = 122; signature = 0x1e 0x96 0x42; ; @@ -11731,6 +12099,8 @@ part parent "x64a1" part parent "x64a1" desc = "ATxmega64A3U"; id = "x64a3u"; + mcuid = 247; + n_interrupts = 127; signature = 0x1e 0x96 0x42; ; @@ -11741,6 +12111,7 @@ part parent "x64a1" part parent "x64a1" desc = "ATxmega64A4"; id = "x64a4"; + mcuid = 251; signature = 0x1e 0x96 0x46; ; @@ -11751,6 +12122,8 @@ part parent "x64a1" part parent "x64a1" desc = "ATxmega64B1"; id = "x64b1"; + mcuid = 245; + n_interrupts = 81; signature = 0x1e 0x96 0x52; usbpid = 0x2fe1; ; @@ -11762,6 +12135,8 @@ part parent "x64a1" part parent "x64a1" desc = "ATxmega64B3"; id = "x64b3"; + mcuid = 248; + n_interrupts = 54; signature = 0x1e 0x96 0x51; usbpid = 0x2fdf; ; @@ -11773,6 +12148,8 @@ part parent "x64a1" part parent ".xmega" desc = "ATxmega128C3"; id = "x128c3"; + mcuid = 261; + n_interrupts = 127; signature = 0x1e 0x97 0x52; usbpid = 0x2fd7; @@ -11826,6 +12203,8 @@ part parent ".xmega" part parent "x128c3" desc = "ATxmega128D3"; id = "x128d3"; + mcuid = 262; + n_interrupts = 114; signature = 0x1e 0x97 0x48; ; @@ -11836,6 +12215,8 @@ part parent "x128c3" part parent "x128c3" desc = "ATxmega128D4"; id = "x128d4"; + mcuid = 265; + n_interrupts = 91; signature = 0x1e 0x97 0x47; memory "flash" @@ -11850,6 +12231,9 @@ part parent "x128c3" part parent "x128c3" desc = "ATxmega128A1"; id = "x128a1"; + prog_modes = PM_SPM | PM_PDI | PM_JTAG; + mcuid = 254; + n_interrupts = 125; signature = 0x1e 0x97 0x4c; has_jtag = yes; @@ -11866,6 +12250,7 @@ part parent "x128c3" part parent "x128a1" desc = "ATxmega128A1revD"; id = "x128a1d"; + mcuid = 255; signature = 0x1e 0x97 0x41; ; @@ -11876,6 +12261,8 @@ part parent "x128a1" part parent "x128a1" desc = "ATxmega128A1U"; id = "x128a1u"; + mcuid = 256; + n_interrupts = 127; usbpid = 0x2fed; ; @@ -11886,6 +12273,8 @@ part parent "x128a1" part parent "x128a1" desc = "ATxmega128A3"; id = "x128a3"; + mcuid = 258; + n_interrupts = 122; signature = 0x1e 0x97 0x42; ; @@ -11896,6 +12285,8 @@ part parent "x128a1" part parent "x128a1" desc = "ATxmega128A3U"; id = "x128a3u"; + mcuid = 259; + n_interrupts = 127; signature = 0x1e 0x97 0x42; usbpid = 0x2fe6; ; @@ -11907,6 +12298,8 @@ part parent "x128a1" part parent ".xmega" desc = "ATxmega128A4"; id = "x128a4"; + prog_modes = PM_SPM | PM_PDI | PM_JTAG; + mcuid = 263; signature = 0x1e 0x97 0x46; has_jtag = yes; @@ -11965,6 +12358,8 @@ part parent ".xmega" part parent ".xmega" desc = "ATxmega128A4U"; id = "x128a4u"; + mcuid = 264; + n_interrupts = 127; signature = 0x1e 0x97 0x46; usbpid = 0x2fde; @@ -12018,6 +12413,9 @@ part parent ".xmega" part parent ".xmega" desc = "ATxmega128B1"; id = "x128b1"; + prog_modes = PM_SPM | PM_PDI | PM_JTAG; + mcuid = 257; + n_interrupts = 81; signature = 0x1e 0x97 0x4d; usbpid = 0x2fea; has_jtag = yes; @@ -12077,6 +12475,8 @@ part parent ".xmega" part parent "x128b1" desc = "ATxmega128B3"; id = "x128b3"; + mcuid = 260; + n_interrupts = 54; signature = 0x1e 0x97 0x4b; usbpid = 0x2fe0; ; @@ -12088,6 +12488,8 @@ part parent "x128b1" part parent ".xmega" desc = "ATxmega192C3"; id = "x192c3"; + mcuid = 269; + n_interrupts = 127; signature = 0x1e 0x97 0x51; # usbpid = 0x2f??; @@ -12141,6 +12543,8 @@ part parent ".xmega" part parent "x192c3" desc = "ATxmega192D3"; id = "x192d3"; + mcuid = 270; + n_interrupts = 114; signature = 0x1e 0x97 0x49; ; @@ -12151,6 +12555,8 @@ part parent "x192c3" part parent "x192c3" desc = "ATxmega192A1"; id = "x192a1"; + prog_modes = PM_SPM | PM_PDI | PM_JTAG; + mcuid = 266; signature = 0x1e 0x97 0x4e; has_jtag = yes; @@ -12167,6 +12573,8 @@ part parent "x192c3" part parent "x192a1" desc = "ATxmega192A3"; id = "x192a3"; + mcuid = 267; + n_interrupts = 122; signature = 0x1e 0x97 0x44; ; @@ -12177,6 +12585,7 @@ part parent "x192a1" part parent "x192a1" desc = "ATxmega192A3U"; id = "x192a3u"; + mcuid = 268; signature = 0x1e 0x97 0x44; usbpid = 0x2fe7; ; @@ -12188,6 +12597,8 @@ part parent "x192a1" part parent ".xmega" desc = "ATxmega256C3"; id = "x256c3"; + mcuid = 276; + n_interrupts = 127; signature = 0x1e 0x98 0x46; usbpid = 0x2fda; @@ -12241,6 +12652,8 @@ part parent ".xmega" part parent "x256c3" desc = "ATxmega256D3"; id = "x256d3"; + mcuid = 277; + n_interrupts = 114; signature = 0x1e 0x98 0x44; ; @@ -12251,6 +12664,8 @@ part parent "x256c3" part parent "x256c3" desc = "ATxmega256A1"; id = "x256a1"; + prog_modes = PM_SPM | PM_PDI | PM_JTAG; + mcuid = 271; has_jtag = yes; memory "fuse0" @@ -12266,6 +12681,8 @@ part parent "x256c3" part parent "x256a1" desc = "ATxmega256A3"; id = "x256a3"; + mcuid = 272; + n_interrupts = 122; signature = 0x1e 0x98 0x42; ; @@ -12276,6 +12693,7 @@ part parent "x256a1" part parent "x256a1" desc = "ATxmega256A3U"; id = "x256a3u"; + mcuid = 275; signature = 0x1e 0x98 0x42; usbpid = 0x2fec; ; @@ -12287,6 +12705,8 @@ part parent "x256a1" part parent "x256a1" desc = "ATxmega256A3B"; id = "x256a3b"; + mcuid = 273; + n_interrupts = 122; signature = 0x1e 0x98 0x43; ; @@ -12297,6 +12717,7 @@ part parent "x256a1" part parent "x256a1" desc = "ATxmega256A3BU"; id = "x256a3bu"; + mcuid = 274; signature = 0x1e 0x98 0x43; usbpid = 0x2fe2; ; @@ -12308,6 +12729,8 @@ part parent "x256a1" part parent ".xmega" desc = "ATxmega384C3"; id = "x384c3"; + mcuid = 278; + n_interrupts = 127; signature = 0x1e 0x98 0x45; usbpid = 0x2fdb; @@ -12361,6 +12784,8 @@ part parent ".xmega" part parent "x384c3" desc = "ATxmega384D3"; id = "x384d3"; + mcuid = 279; + n_interrupts = 114; signature = 0x1e 0x98 0x47; ; @@ -12371,6 +12796,8 @@ part parent "x384c3" part parent ".xmega" desc = "ATxmega8E5"; id = "x8e5"; + mcuid = 230; + n_interrupts = 43; signature = 0x1e 0x93 0x41; memory "eeprom" @@ -12423,6 +12850,8 @@ part parent ".xmega" part parent ".xmega" desc = "ATxmega16E5"; id = "x16e5"; + mcuid = 235; + n_interrupts = 43; signature = 0x1e 0x94 0x45; memory "eeprom" @@ -12475,6 +12904,8 @@ part parent ".xmega" part parent ".xmega" desc = "ATxmega32E5"; id = "x32e5"; + mcuid = 242; + n_interrupts = 43; signature = 0x1e 0x95 0x4c; memory "eeprom" @@ -12527,6 +12958,7 @@ part parent ".xmega" part desc = "AT32UC3A0512"; id = "uc3a0512"; + prog_modes = PM_JTAG | PM_aWire; signature = 0xed 0xc0 0x3f; has_jtag = yes; is_avr32 = yes; @@ -12557,6 +12989,10 @@ part parent "uc3a0512" part desc = "ATtiny1634"; id = "t1634"; + prog_modes = PM_SPM | PM_ISP | PM_HVPP | PM_debugWIRE; + mcuid = 40; + n_interrupts = 28; + n_page_erase = 4; stk500_devcode = 0x86; chip_erase_delay = 9000; pagel = 0xb3; @@ -12681,6 +13117,7 @@ part part parent "t1634" desc = "ATtiny1634R"; id = "t1634r"; + mcuid = 41; ; #------------------------------------------------------------ @@ -12690,6 +13127,7 @@ part parent "t1634" part desc = "Common values for reduced core tinys"; id = ".reduced_core_tiny"; + prog_modes = PM_TPI; has_tpi = yes; memory "fuse" @@ -12731,6 +13169,7 @@ part part parent ".reduced_core_tiny" desc = "ATtiny4"; id = "t4"; + n_interrupts = 10; signature = 0x1e 0x8f 0x0a; memory "flash" @@ -12748,6 +13187,8 @@ part parent ".reduced_core_tiny" part parent "t4" desc = "ATtiny5"; id = "t5"; + mcuid = 1; + n_interrupts = 11; signature = 0x1e 0x8f 0x09; ; @@ -12758,6 +13199,8 @@ part parent "t4" part parent ".reduced_core_tiny" desc = "ATtiny9"; id = "t9"; + mcuid = 2; + n_interrupts = 10; signature = 0x1e 0x90 0x08; memory "flash" @@ -12775,6 +13218,8 @@ part parent ".reduced_core_tiny" part parent "t9" desc = "ATtiny10"; id = "t10"; + mcuid = 3; + n_interrupts = 11; signature = 0x1e 0x90 0x03; ; @@ -12785,6 +13230,8 @@ part parent "t9" part parent ".reduced_core_tiny" desc = "ATtiny20"; id = "t20"; + mcuid = 4; + n_interrupts = 17; signature = 0x1e 0x91 0x0f; memory "flash" @@ -12802,6 +13249,8 @@ part parent ".reduced_core_tiny" part parent ".reduced_core_tiny" desc = "ATtiny40"; id = "t40"; + mcuid = 5; + n_interrupts = 18; signature = 0x1e 0x92 0x0e; memory "flash" @@ -12819,6 +13268,7 @@ part parent ".reduced_core_tiny" part parent ".reduced_core_tiny" desc = "ATtiny102"; id = "t102"; + mcuid = 6; signature = 0x1e 0x90 0x0c; memory "flash" @@ -12836,6 +13286,7 @@ part parent ".reduced_core_tiny" part parent ".reduced_core_tiny" desc = "ATtiny104"; id = "t104"; + mcuid = 7; signature = 0x1e 0x90 0x0b; memory "flash" @@ -12853,6 +13304,9 @@ part parent ".reduced_core_tiny" part desc = "ATmega406"; id = "m406"; + prog_modes = PM_SPM | PM_HVPP | PM_JTAG; + mcuid = 125; + n_interrupts = 23; # STK500 parameters (parallel programming IO lines) pagel = 0xa7; bs2 = 0xa0; @@ -12915,6 +13369,7 @@ part part desc = "AVR8X family common values"; id = ".avr8x"; + prog_modes = PM_SPM | PM_UPDI; has_updi = yes; nvm_base = 0x1000; ocd_base = 0x0f80; @@ -13128,6 +13583,8 @@ part parent ".avr8x" part parent ".avr8x_tiny" desc = "ATtiny202"; id = "t202"; + mcuid = 280; + n_interrupts = 26; signature = 0x1e 0x91 0x23; memory "eeprom" @@ -13152,6 +13609,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny204"; id = "t204"; + mcuid = 281; + n_interrupts = 26; signature = 0x1e 0x91 0x22; memory "eeprom" @@ -13176,6 +13635,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny402"; id = "t402"; + mcuid = 284; + n_interrupts = 26; signature = 0x1e 0x92 0x27; memory "eeprom" @@ -13200,6 +13661,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny404"; id = "t404"; + mcuid = 285; + n_interrupts = 26; signature = 0x1e 0x92 0x26; memory "eeprom" @@ -13224,6 +13687,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny406"; id = "t406"; + mcuid = 286; + n_interrupts = 26; signature = 0x1e 0x92 0x25; memory "eeprom" @@ -13248,6 +13713,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny804"; id = "t804"; + mcuid = 295; + n_interrupts = 31; signature = 0x1e 0x93 0x25; memory "eeprom" @@ -13272,6 +13739,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny806"; id = "t806"; + mcuid = 296; + n_interrupts = 31; signature = 0x1e 0x93 0x24; memory "eeprom" @@ -13296,6 +13765,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny807"; id = "t807"; + mcuid = 297; + n_interrupts = 31; signature = 0x1e 0x93 0x23; memory "eeprom" @@ -13320,6 +13791,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny1604"; id = "t1604"; + mcuid = 304; + n_interrupts = 31; signature = 0x1e 0x94 0x25; memory "eeprom" @@ -13344,6 +13817,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny1606"; id = "t1606"; + mcuid = 305; + n_interrupts = 31; signature = 0x1e 0x94 0x24; memory "eeprom" @@ -13368,6 +13843,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny1607"; id = "t1607"; + mcuid = 306; + n_interrupts = 31; signature = 0x1e 0x94 0x23; memory "eeprom" @@ -13392,6 +13869,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny212"; id = "t212"; + mcuid = 282; + n_interrupts = 26; signature = 0x1e 0x91 0x21; memory "eeprom" @@ -13416,6 +13895,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny214"; id = "t214"; + mcuid = 283; + n_interrupts = 26; signature = 0x1e 0x91 0x20; memory "eeprom" @@ -13440,6 +13921,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny412"; id = "t412"; + mcuid = 287; + n_interrupts = 26; signature = 0x1e 0x92 0x23; memory "eeprom" @@ -13464,6 +13947,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny414"; id = "t414"; + mcuid = 288; + n_interrupts = 26; signature = 0x1e 0x92 0x22; memory "eeprom" @@ -13488,6 +13973,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny416"; id = "t416"; + mcuid = 289; + n_interrupts = 26; signature = 0x1e 0x92 0x21; memory "eeprom" @@ -13512,6 +13999,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny417"; id = "t417"; + mcuid = 291; + n_interrupts = 26; signature = 0x1e 0x92 0x20; memory "eeprom" @@ -13536,6 +14025,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny814"; id = "t814"; + mcuid = 298; + n_interrupts = 26; signature = 0x1e 0x93 0x22; memory "eeprom" @@ -13560,6 +14051,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny816"; id = "t816"; + mcuid = 299; + n_interrupts = 26; signature = 0x1e 0x93 0x21; memory "eeprom" @@ -13584,6 +14077,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny817"; id = "t817"; + mcuid = 300; + n_interrupts = 26; signature = 0x1e 0x93 0x20; memory "eeprom" @@ -13608,6 +14103,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny1614"; id = "t1614"; + mcuid = 307; + n_interrupts = 31; signature = 0x1e 0x94 0x22; memory "eeprom" @@ -13632,6 +14129,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny1616"; id = "t1616"; + mcuid = 308; + n_interrupts = 31; signature = 0x1e 0x94 0x21; memory "eeprom" @@ -13656,6 +14155,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny1617"; id = "t1617"; + mcuid = 309; + n_interrupts = 31; signature = 0x1e 0x94 0x20; memory "eeprom" @@ -13680,6 +14181,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny3216"; id = "t3216"; + mcuid = 314; + n_interrupts = 31; signature = 0x1e 0x95 0x21; memory "eeprom" @@ -13704,6 +14207,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny3217"; id = "t3217"; + mcuid = 315; + n_interrupts = 31; signature = 0x1e 0x95 0x22; memory "eeprom" @@ -13728,6 +14233,7 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny424"; id = "t424"; + mcuid = 292; signature = 0x1e 0x92 0x2c; memory "eeprom" @@ -13752,6 +14258,7 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny426"; id = "t426"; + mcuid = 293; signature = 0x1e 0x92 0x2b; memory "eeprom" @@ -13776,6 +14283,7 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny427"; id = "t427"; + mcuid = 294; signature = 0x1e 0x92 0x2a; memory "eeprom" @@ -13800,6 +14308,7 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny824"; id = "t824"; + mcuid = 301; signature = 0x1e 0x93 0x29; memory "eeprom" @@ -13824,6 +14333,7 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny826"; id = "t826"; + mcuid = 302; signature = 0x1e 0x93 0x28; memory "eeprom" @@ -13848,6 +14358,7 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny827"; id = "t827"; + mcuid = 303; signature = 0x1e 0x93 0x27; memory "eeprom" @@ -13872,6 +14383,7 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny1624"; id = "t1624"; + mcuid = 310; signature = 0x1e 0x94 0x2a; memory "eeprom" @@ -13896,6 +14408,7 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny1626"; id = "t1626"; + mcuid = 311; signature = 0x1e 0x94 0x29; memory "eeprom" @@ -13920,6 +14433,7 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny1627"; id = "t1627"; + mcuid = 312; signature = 0x1e 0x94 0x28; memory "eeprom" @@ -13944,6 +14458,7 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny3224"; id = "t3224"; + mcuid = 316; signature = 0x1e 0x95 0x28; memory "eeprom" @@ -13968,6 +14483,7 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny3226"; id = "t3226"; + mcuid = 317; signature = 0x1e 0x95 0x27; memory "eeprom" @@ -13992,6 +14508,7 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATtiny3227"; id = "t3227"; + mcuid = 318; signature = 0x1e 0x95 0x26; memory "eeprom" @@ -14016,6 +14533,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATmega808"; id = "m808"; + mcuid = 319; + n_interrupts = 36; signature = 0x1e 0x93 0x26; memory "eeprom" @@ -14040,6 +14559,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATmega809"; id = "m809"; + mcuid = 320; + n_interrupts = 40; signature = 0x1e 0x93 0x2a; memory "eeprom" @@ -14064,6 +14585,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATmega1608"; id = "m1608"; + mcuid = 321; + n_interrupts = 36; signature = 0x1e 0x94 0x27; memory "eeprom" @@ -14088,6 +14611,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" desc = "ATmega1609"; id = "m1609"; + mcuid = 322; + n_interrupts = 40; signature = 0x1e 0x94 0x26; memory "eeprom" @@ -14112,6 +14637,8 @@ part parent ".avr8x_tiny" part parent ".avr8x_mega" desc = "ATmega3208"; id = "m3208"; + mcuid = 323; + n_interrupts = 36; signature = 0x1e 0x95 0x30; memory "eeprom" @@ -14136,6 +14663,8 @@ part parent ".avr8x_mega" part parent ".avr8x_mega" desc = "ATmega3209"; id = "m3209"; + mcuid = 324; + n_interrupts = 40; signature = 0x1e 0x95 0x31; memory "eeprom" @@ -14160,6 +14689,8 @@ part parent ".avr8x_mega" part parent ".avr8x_mega" desc = "ATmega4808"; id = "m4808"; + mcuid = 325; + n_interrupts = 36; signature = 0x1e 0x96 0x50; memory "eeprom" @@ -14184,6 +14715,8 @@ part parent ".avr8x_mega" part parent ".avr8x_mega" desc = "ATmega4809"; id = "m4809"; + mcuid = 326; + n_interrupts = 40; signature = 0x1e 0x96 0x51; memory "eeprom" @@ -14208,6 +14741,7 @@ part parent ".avr8x_mega" part desc = "AVR-Dx family common values"; id = ".avrdx"; + prog_modes = PM_SPM | PM_UPDI; # Dedicated UPDI pin, no HV hvupdi_variant = 1; has_updi = yes; @@ -14364,6 +14898,7 @@ part part parent ".avrdx" desc = "AVR32DA28"; id = "avr32da28"; + mcuid = 338; signature = 0x1e 0x95 0x34; memory "eeprom" @@ -14387,6 +14922,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR32DA32"; id = "avr32da32"; + mcuid = 342; signature = 0x1e 0x95 0x33; memory "eeprom" @@ -14410,6 +14946,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR32DA48"; id = "avr32da48"; + mcuid = 346; signature = 0x1e 0x95 0x32; memory "eeprom" @@ -14433,6 +14970,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR64DA28"; id = "avr64da28"; + mcuid = 351; signature = 0x1e 0x96 0x15; memory "eeprom" @@ -14456,6 +14994,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR64DA32"; id = "avr64da32"; + mcuid = 355; signature = 0x1e 0x96 0x14; memory "eeprom" @@ -14479,6 +15018,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR64DA48"; id = "avr64da48"; + mcuid = 359; signature = 0x1e 0x96 0x13; memory "eeprom" @@ -14502,6 +15042,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR64DA64"; id = "avr64da64"; + mcuid = 362; signature = 0x1e 0x96 0x12; memory "eeprom" @@ -14525,6 +15066,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR128DA28"; id = "avr128da28"; + mcuid = 364; signature = 0x1e 0x97 0x0a; memory "eeprom" @@ -14548,6 +15090,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR128DA32"; id = "avr128da32"; + mcuid = 366; signature = 0x1e 0x97 0x09; memory "eeprom" @@ -14571,6 +15114,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR128DA48"; id = "avr128da48"; + mcuid = 368; signature = 0x1e 0x97 0x08; memory "eeprom" @@ -14594,6 +15138,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR128DA64"; id = "avr128da64"; + mcuid = 370; signature = 0x1e 0x97 0x07; memory "eeprom" @@ -14617,6 +15162,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR32DB28"; id = "avr32db28"; + mcuid = 339; signature = 0x1e 0x95 0x37; memory "eeprom" @@ -14640,6 +15186,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR32DB32"; id = "avr32db32"; + mcuid = 343; signature = 0x1e 0x95 0x36; memory "eeprom" @@ -14663,6 +15210,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR32DB48"; id = "avr32db48"; + mcuid = 347; signature = 0x1e 0x95 0x35; memory "eeprom" @@ -14686,6 +15234,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR64DB28"; id = "avr64db28"; + mcuid = 352; signature = 0x1e 0x96 0x19; memory "eeprom" @@ -14709,6 +15258,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR64DB32"; id = "avr64db32"; + mcuid = 356; signature = 0x1e 0x96 0x18; memory "eeprom" @@ -14732,6 +15282,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR64DB48"; id = "avr64db48"; + mcuid = 360; signature = 0x1e 0x96 0x17; memory "eeprom" @@ -14755,6 +15306,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR64DB64"; id = "avr64db64"; + mcuid = 363; signature = 0x1e 0x96 0x16; memory "eeprom" @@ -14778,6 +15330,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR128DB28"; id = "avr128db28"; + mcuid = 365; signature = 0x1e 0x97 0x0e; memory "eeprom" @@ -14801,6 +15354,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR128DB32"; id = "avr128db32"; + mcuid = 367; signature = 0x1e 0x97 0x0d; memory "eeprom" @@ -14824,6 +15378,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR128DB48"; id = "avr128db48"; + mcuid = 369; signature = 0x1e 0x97 0x0c; memory "eeprom" @@ -14847,6 +15402,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR128DB64"; id = "avr128db64"; + mcuid = 371; signature = 0x1e 0x97 0x0b; memory "eeprom" @@ -14870,6 +15426,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR16DD14"; id = "avr16dd14"; + mcuid = 329; hvupdi_variant = 2; signature = 0x1e 0x94 0x34; @@ -14894,6 +15451,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR16DD20"; id = "avr16dd20"; + mcuid = 330; hvupdi_variant = 2; signature = 0x1e 0x94 0x33; @@ -14918,6 +15476,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR16DD28"; id = "avr16dd28"; + mcuid = 331; hvupdi_variant = 2; signature = 0x1e 0x94 0x32; @@ -14942,6 +15501,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR16DD32"; id = "avr16dd32"; + mcuid = 333; hvupdi_variant = 2; signature = 0x1e 0x94 0x31; @@ -14966,6 +15526,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR32DD14"; id = "avr32dd14"; + mcuid = 336; hvupdi_variant = 2; signature = 0x1e 0x95 0x3b; @@ -14990,6 +15551,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR32DD20"; id = "avr32dd20"; + mcuid = 337; hvupdi_variant = 2; signature = 0x1e 0x95 0x3a; @@ -15014,6 +15576,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR32DD28"; id = "avr32dd28"; + mcuid = 340; hvupdi_variant = 2; signature = 0x1e 0x95 0x39; @@ -15038,6 +15601,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR32DD32"; id = "avr32dd32"; + mcuid = 344; hvupdi_variant = 2; signature = 0x1e 0x95 0x38; @@ -15062,6 +15626,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR64DD14"; id = "avr64dd14"; + mcuid = 349; hvupdi_variant = 2; signature = 0x1e 0x96 0x1d; @@ -15086,6 +15651,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR64DD20"; id = "avr64dd20"; + mcuid = 350; hvupdi_variant = 2; signature = 0x1e 0x96 0x1c; @@ -15110,6 +15676,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR64DD28"; id = "avr64dd28"; + mcuid = 353; hvupdi_variant = 2; signature = 0x1e 0x96 0x1b; @@ -15134,6 +15701,7 @@ part parent ".avrdx" part parent ".avrdx" desc = "AVR64DD32"; id = "avr64dd32"; + mcuid = 357; hvupdi_variant = 2; signature = 0x1e 0x96 0x1a; @@ -15179,6 +15747,7 @@ part parent ".avrdx" part parent ".avrex" desc = "AVR8EA28"; id = "avr8ea28"; + mcuid = 327; signature = 0x1e 0x93 0x2c; memory "eeprom" @@ -15203,6 +15772,7 @@ part parent ".avrex" part parent ".avrex" desc = "AVR8EA32"; id = "avr8ea32"; + mcuid = 328; signature = 0x1e 0x93 0x2b; memory "eeprom" @@ -15227,6 +15797,7 @@ part parent ".avrex" part parent ".avrex" desc = "AVR16EA28"; id = "avr16ea28"; + mcuid = 332; signature = 0x1e 0x94 0x37; memory "eeprom" @@ -15251,6 +15822,7 @@ part parent ".avrex" part parent ".avrex" desc = "AVR16EA32"; id = "avr16ea32"; + mcuid = 334; signature = 0x1e 0x94 0x36; memory "eeprom" @@ -15275,6 +15847,7 @@ part parent ".avrex" part parent ".avrex" desc = "AVR16EA48"; id = "avr16ea48"; + mcuid = 335; signature = 0x1e 0x94 0x35; memory "eeprom" @@ -15299,6 +15872,7 @@ part parent ".avrex" part parent ".avrex" desc = "AVR32EA28"; id = "avr32ea28"; + mcuid = 341; signature = 0x1e 0x95 0x3e; memory "eeprom" @@ -15323,6 +15897,7 @@ part parent ".avrex" part parent ".avrex" desc = "AVR32EA32"; id = "avr32ea32"; + mcuid = 345; signature = 0x1e 0x95 0x3d; memory "eeprom" @@ -15347,6 +15922,7 @@ part parent ".avrex" part parent ".avrex" desc = "AVR32EA48"; id = "avr32ea48"; + mcuid = 348; signature = 0x1e 0x95 0x3c; memory "eeprom" @@ -15371,6 +15947,7 @@ part parent ".avrex" part parent ".avrex" desc = "AVR64EA28"; id = "avr64ea28"; + mcuid = 354; signature = 0x1e 0x96 0x20; memory "eeprom" @@ -15395,6 +15972,7 @@ part parent ".avrex" part parent ".avrex" desc = "AVR64EA32"; id = "avr64ea32"; + mcuid = 358; signature = 0x1e 0x96 0x1f; memory "eeprom" @@ -15419,6 +15997,7 @@ part parent ".avrex" part parent ".avrex" desc = "AVR64EA48"; id = "avr64ea48"; + mcuid = 361; signature = 0x1e 0x96 0x1e; memory "eeprom" @@ -15443,6 +16022,7 @@ part parent ".avrex" part parent "m88" desc = "LGT8F88P"; id = "lgt8f88p"; + mcuid = 227; signature = 0x1e 0x93 0x0f; ; @@ -15453,6 +16033,7 @@ part parent "m88" part parent "m168" desc = "LGT8F168P"; id = "lgt8f168p"; + mcuid = 228; signature = 0x1e 0x94 0x0b; ; @@ -15463,5 +16044,6 @@ part parent "m168" part parent "m328" desc = "LGT8F328P"; id = "lgt8f328p"; + mcuid = 229; signature = 0x1e 0x95 0x0f; ; From 0756b8e3adf26fb97ef7f81ca2ce4162127c5e5c Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Tue, 30 Aug 2022 02:49:37 +0100 Subject: [PATCH 03/11] Declare rather than define current_strct in header config.h --- src/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.h b/src/config.h index 42b6219b..e92400b6 100644 --- a/src/config.h +++ b/src/config.h @@ -94,7 +94,7 @@ extern FILE * yyin; extern PROGRAMMER * current_prog; extern AVRPART * current_part; extern AVRMEM * current_mem; -int current_strct; +extern int current_strct; extern int cfg_lineno; extern char * cfg_infile; extern LISTID string_list; From b0198a319f13a8ce6f3e354562acd5189cd9e659 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Tue, 30 Aug 2022 16:33:42 +0100 Subject: [PATCH 04/11] Offload the programming interface info from part->flags to part->prog_modes flags now just hold parameters of the JTAG interface and some secondary serial, parallel, pseudo parallel info. This separation brings clarity. It used to be hard to augur whether a part has an ISP interface: (part->flags & (AVRPART_HAS_PDI | AVRPART_AVR32 | AVRPART_HAS_TPI | AVRPART_HAS_UPDI)) == 0 && (part->flags & AVRPART_SERIALOK) != 0 or had HVSP or HVPP capability, for that matter. Now it is just, eg, part->prog_modes & PM_ISP part->prog_modes & PM_HVPP --- src/avr.c | 17 +++++------ src/avrftdi.c | 4 +-- src/bitbang.c | 8 ++--- src/config_gram.y | 42 ++++++++------------------ src/developer_opts.c | 25 ++++++++------- src/fileio.c | 17 +++-------- src/flip1.c | 2 +- src/flip2.c | 2 +- src/ft245r.c | 6 ++-- src/jtag3.c | 72 +++++++++++++++++++++----------------------- src/jtagmkI.c | 2 +- src/jtagmkII.c | 63 ++++++++++++++++++-------------------- src/libavrdude.h | 20 +++++------- src/linuxspi.c | 4 +-- src/main.c | 11 +++---- src/stk500v2.c | 28 ++++++++--------- src/usbasp.c | 2 +- src/usbtiny.c | 6 ++-- 18 files changed, 144 insertions(+), 187 deletions(-) diff --git a/src/avr.c b/src/avr.c index 7a1f34a6..7bfa1496 100644 --- a/src/avr.c +++ b/src/avr.c @@ -52,7 +52,7 @@ int avr_tpi_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) { int err; AVRMEM *mem; - if (p->flags & AVRPART_HAS_TPI) { + if (p->prog_modes & PM_TPI) { pgm->pgm_led(pgm, ON); /* Set Pointer Register */ @@ -102,7 +102,7 @@ int avr_tpi_program_enable(const PROGRAMMER *pgm, const AVRPART *p, unsigned cha unsigned char cmd[2]; unsigned char response; - if(p->flags & AVRPART_HAS_TPI) { + if(p->prog_modes & PM_TPI) { /* set guard time */ cmd[0] = (TPI_CMD_SSTCS | TPI_REG_TPIPCR); cmd[1] = guard_time; @@ -194,7 +194,7 @@ int avr_read_byte_default(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM pgm->pgm_led(pgm, ON); pgm->err_led(pgm, OFF); - if (p->flags & AVRPART_HAS_TPI) { + if (p->prog_modes & PM_TPI) { if (pgm->cmd_tpi == NULL) { avrdude_message(MSG_INFO, "%s: Error: %s programmer does not support TPI\n", progname, pgm->type); @@ -342,7 +342,7 @@ int avr_read(const PROGRAMMER *pgm, const AVRPART *p, const char *memtype, memset(mem->buf, 0xff, mem->size); /* supports "paged load" thru post-increment */ - if ((p->flags & AVRPART_HAS_TPI) && mem->page_size > 1 && + if ((p->prog_modes & PM_TPI) && mem->page_size > 1 && mem->size % mem->page_size == 0 && pgm->cmd_tpi != NULL) { while (avr_tpi_poll_nvmbsy(pgm)); @@ -550,7 +550,7 @@ int avr_write_byte_default(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM return -1; } - if (p->flags & AVRPART_HAS_TPI) { + if (p->prog_modes & PM_TPI) { if (pgm->cmd_tpi == NULL) { avrdude_message(MSG_INFO, "%s: Error: %s programmer does not support TPI\n", progname, pgm->type); @@ -596,8 +596,7 @@ int avr_write_byte_default(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM return 0; } - if (!mem->paged && - (p->flags & AVRPART_IS_AT90S1200) == 0) { + if (!mem->paged && (p->flags & AVRPART_IS_AT90S1200) == 0) { /* * check to see if the write is necessary by reading the existing * value and only write if we are changing the value; we can't @@ -839,9 +838,7 @@ int avr_write(const PROGRAMMER *pgm, const AVRPART *p, const char *memtype, } - if ((p->flags & AVRPART_HAS_TPI) && m->page_size > 1 && - pgm->cmd_tpi != NULL) { - + if ((p->prog_modes & PM_TPI) && m->page_size > 1 && pgm->cmd_tpi) { if (wsize == 1) { /* fuse (configuration) memory: only single byte to write */ return avr_write_byte(pgm, p, m, 0, m->buf[0]) == 0? 1: -1; diff --git a/src/avrftdi.c b/src/avrftdi.c index e80df3c0..febc4005 100644 --- a/src/avrftdi.c +++ b/src/avrftdi.c @@ -267,7 +267,7 @@ static void avrftdi_enable(PROGRAMMER *pgm, const AVRPART *p) { set_pin(pgm, PPI_AVR_BUFF, ON); // Switch to TPI initialisation in avrftdi_tpi.c - if(p->flags & AVRPART_HAS_TPI) + if(p->prog_modes & PM_TPI) avrftdi_tpi_initpgm(pgm); } @@ -808,7 +808,7 @@ static void avrftdi_close(PROGRAMMER * pgm) static int avrftdi_initialize(const PROGRAMMER *pgm, const AVRPART *p) { avrftdi_powerup(pgm); - if(p->flags & AVRPART_HAS_TPI) + if(p->prog_modes & PM_TPI) { /* see avrftdi_tpi.c */ avrftdi_tpi_initialize(pgm, p); diff --git a/src/bitbang.c b/src/bitbang.c index c043d740..af468926 100644 --- a/src/bitbang.c +++ b/src/bitbang.c @@ -422,7 +422,7 @@ int bitbang_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) { unsigned char res[4]; AVRMEM *mem; - if (p->flags & AVRPART_HAS_TPI) { + if (p->prog_modes & PM_TPI) { pgm->pgm_led(pgm, ON); while (avr_tpi_poll_nvmbsy(pgm)); @@ -482,7 +482,7 @@ int bitbang_program_enable(const PROGRAMMER *pgm, const AVRPART *p) { unsigned char res[4]; int i; - if (p->flags & AVRPART_HAS_TPI) { + if (p->prog_modes & PM_TPI) { /* enable NVM programming */ bitbang_tpi_tx(pgm, TPI_CMD_SKEY); for (i = sizeof(tpi_skey) - 1; i >= 0; i--) @@ -524,7 +524,7 @@ int bitbang_initialize(const PROGRAMMER *pgm, const AVRPART *p) { usleep(20000); /* TPIDATA is a single line, so MISO & MOSI should be connected */ - if (p->flags & AVRPART_HAS_TPI) { + if (p->prog_modes & PM_TPI) { /* make sure cmd_tpi() is defined */ if (pgm->cmd_tpi == NULL) { avrdude_message(MSG_INFO, "%s: Error: %s programmer does not support TPI\n", @@ -559,7 +559,7 @@ int bitbang_initialize(const PROGRAMMER *pgm, const AVRPART *p) { pgm->setpin(pgm, PIN_AVR_RESET, 0); usleep(20000); - if (p->flags & AVRPART_HAS_TPI) { + if (p->prog_modes & PM_TPI) { /* keep TPIDATA high for 16 clock cycles */ pgm->setpin(pgm, PIN_AVR_MOSI, 1); for (i = 0; i < 16; i++) diff --git a/src/config_gram.y b/src/config_gram.y index bc48d098..f8a20629 100644 --- a/src/config_gram.y +++ b/src/config_gram.y @@ -1117,61 +1117,46 @@ part_parm : K_HAS_JTAG TKN_EQUAL yesno { - if ($3->primary == K_YES) { - current_part->flags |= AVRPART_HAS_JTAG; + if ($3->primary == K_YES) current_part->prog_modes |= PM_JTAG; - } else if ($3->primary == K_NO) { - current_part->flags &= ~AVRPART_HAS_JTAG; + else if ($3->primary == K_NO) current_part->prog_modes &= ~PM_JTAG; - } free_token($3); } | K_HAS_DW TKN_EQUAL yesno { - if ($3->primary == K_YES) { - current_part->flags |= AVRPART_HAS_DW; + if ($3->primary == K_YES) current_part->prog_modes |= PM_debugWIRE; - } else if ($3->primary == K_NO) { - current_part->flags &= ~AVRPART_HAS_DW; + else if ($3->primary == K_NO) current_part->prog_modes &= ~PM_debugWIRE; - } free_token($3); } | K_HAS_PDI TKN_EQUAL yesno { - if ($3->primary == K_YES) { - current_part->flags |= AVRPART_HAS_PDI; + if ($3->primary == K_YES) current_part->prog_modes |= PM_PDI; - } else if ($3->primary == K_NO) { - current_part->flags &= ~AVRPART_HAS_PDI; + else if ($3->primary == K_NO) current_part->prog_modes &= ~PM_PDI; - } free_token($3); } | K_HAS_UPDI TKN_EQUAL yesno { - if ($3->primary == K_YES) { - current_part->flags |= AVRPART_HAS_UPDI; + if ($3->primary == K_YES) current_part->prog_modes |= PM_UPDI; - } else if ($3->primary == K_NO) { - current_part->flags &= ~AVRPART_HAS_UPDI; + else if ($3->primary == K_NO) current_part->prog_modes &= ~PM_UPDI; - } free_token($3); } | K_HAS_TPI TKN_EQUAL yesno { - if ($3->primary == K_YES) { - current_part->flags |= AVRPART_HAS_TPI; + if ($3->primary == K_YES) current_part->prog_modes |= PM_TPI; - } else if ($3->primary == K_NO) { - current_part->flags &= ~AVRPART_HAS_TPI; + else if ($3->primary == K_NO) current_part->prog_modes &= ~PM_TPI; - } free_token($3); } | @@ -1187,13 +1172,10 @@ part_parm : K_IS_AVR32 TKN_EQUAL yesno { - if ($3->primary == K_YES) { - current_part->flags |= AVRPART_AVR32; + if ($3->primary == K_YES) current_part->prog_modes |= PM_aWire; - } else if ($3->primary == K_NO) { - current_part->flags &= ~AVRPART_AVR32; + else if ($3->primary == K_NO) current_part->prog_modes &= ~PM_aWire; - } free_token($3); } | diff --git a/src/developer_opts.c b/src/developer_opts.c index 8f716f03..c9efc7cf 100644 --- a/src/developer_opts.c +++ b/src/developer_opts.c @@ -74,8 +74,6 @@ static struct { }; - - // Return 0 if op code would encode (essentially) the same SPI command static int opcodecmp(const OPCODE *op1, const OPCODE *op2, int opnum) { char *opstr1, *opstr2, *p; @@ -134,6 +132,13 @@ static void printallopcodes(const AVRPART *p, const char *d, OPCODE * const *opa // Programming modes + +/* + * p->flags no longer used for programming modes, use p->prog_modes + * + + remove this comment in 2023 + static char *prog_modes_str_flags(const AVRPART *p) { static char type[1024]; @@ -194,6 +199,10 @@ static char *prog_modes_str_flags(const AVRPART *p) { return type + (*type == '|'); } + * + */ + + static char *prog_modes_str(int pm) { static char type[1024]; @@ -627,13 +636,7 @@ static void dev_part_strct(const AVRPART *p, bool tsv, const AVRPART *base, bool if(tsv) { _partout("0x%04x", flags); } else { - _if_flagout(AVRPART_HAS_JTAG, has_jtag); - _if_flagout(AVRPART_HAS_DW, has_debugwire); - _if_flagout(AVRPART_HAS_PDI, has_pdi); - _if_flagout(AVRPART_HAS_UPDI, has_updi); - _if_flagout(AVRPART_HAS_TPI, has_tpi); _if_flagout(AVRPART_IS_AT90S1200, is_at90s1200); - _if_flagout(AVRPART_AVR32, is_avr32); _if_flagout(AVRPART_ALLOWFULLPAGEBITSTREAM, allowfullpagebitstream); _if_flagout(AVRPART_ENABLEPAGEPROGRAMMING, enablepageprogramming); _if_flagout(AVRPART_SERIALOK, serial); @@ -1064,7 +1067,7 @@ void dev_output_part_defs(char *partdesc) { nfuses, ok, p->flags, - prog_modes_str_flags(p), + prog_modes_str(p->prog_modes), p->config_file, p->lineno ); } @@ -1083,14 +1086,14 @@ void dev_output_part_defs(char *partdesc) { // Print wait delays for AVR family parts if(waits) { - if(!(p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI | AVRPART_HAS_TPI | AVRPART_AVR32))) + if(p->prog_modes & PM_ISP) dev_info(".wd_chip_erase %.3f ms %s\n", p->chip_erase_delay/1000.0, p->desc); if(p->mem) { for(LNODEID lnm=lfirst(p->mem); lnm; lnm=lnext(lnm)) { AVRMEM *m = ldata(lnm); // Write delays not needed for read-only calibration and signature memories if(strcmp(m->desc, "calibration") && strcmp(m->desc, "signature")) { - if(!(p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI | AVRPART_HAS_TPI | AVRPART_AVR32))) { + if(p->prog_modes & PM_ISP) { if(m->min_write_delay == m->max_write_delay) dev_info(".wd_%s %.3f ms %s\n", m->desc, m->min_write_delay/1000.0, p->desc); else { diff --git a/src/fileio.c b/src/fileio.c index 52e9afef..d28a4bfd 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -778,7 +778,7 @@ static int elf_mem_limits(AVRMEM *mem, struct avrpart * p, { int rv = 0; - if (p->flags & AVRPART_AVR32) { + if (p->prog_modes & PM_aWire) { // AVR32 if (strcmp(mem->desc, "flash") == 0) { *lowbound = 0x80000000; *highbound = 0xffffffff; @@ -850,7 +850,7 @@ static int elf2b(char * infile, FILE * inf, * sections out of an ELF file that contains section data for more * than one sub-segment. */ - if ((p->flags & AVRPART_HAS_PDI) != 0 && + if ((p->prog_modes & PM_PDI) != 0 && (strcmp(mem->desc, "boot") == 0 || strcmp(mem->desc, "application") == 0 || strcmp(mem->desc, "apptable") == 0)) { @@ -893,7 +893,7 @@ static int elf2b(char * infile, FILE * inf, const char *endianname; unsigned char endianess; - if (p->flags & AVRPART_AVR32) { + if (p->prog_modes & PM_aWire) { // AVR32 endianess = ELFDATA2MSB; endianname = "little"; } else { @@ -923,7 +923,7 @@ static int elf2b(char * infile, FILE * inf, const char *mname; uint16_t machine; - if (p->flags & AVRPART_AVR32) { + if (p->prog_modes & PM_aWire) { machine = EM_AVR32; mname = "AVR32"; } else { @@ -1383,14 +1383,7 @@ int fileio_setparms(int op, struct fioparms * fp, * AVR32 devices maintain their load offset within the file itself, * but AVRDUDE maintains all memory images 0-based. */ - if ((p->flags & AVRPART_AVR32) != 0) - { - fp->fileoffset = m->offset; - } - else - { - fp->fileoffset = 0; - } + fp->fileoffset = p->prog_modes & PM_aWire? m->offset: 0; return 0; } diff --git a/src/flip1.c b/src/flip1.c index dbddfaf0..a57f7259 100644 --- a/src/flip1.c +++ b/src/flip1.c @@ -239,7 +239,7 @@ int flip1_initialize(const PROGRAMMER *pgm, const AVRPART *part) { } else { pid = part->usbpid; } - if (!ovsigck && (part->flags & AVRPART_HAS_PDI)) { + if (!ovsigck && (part->prog_modes & PM_PDI)) { avrdude_message(MSG_INFO, "%s: \"flip1\" (FLIP protocol version 1) is for AT90USB* and ATmega*U* devices.\n" "%s For Xmega devices, use \"flip2\".\n" "%s (Use -F to bypass this check.)\n", diff --git a/src/flip2.c b/src/flip2.c index a26da242..2925030c 100644 --- a/src/flip2.c +++ b/src/flip2.c @@ -234,7 +234,7 @@ int flip2_initialize(const PROGRAMMER *pgm, const AVRPART *part) { pid = part->usbpid; } - if (!ovsigck && !(part->flags & AVRPART_HAS_PDI)) { + if (!ovsigck && !(part->prog_modes & PM_PDI)) { avrdude_message(MSG_INFO, "%s: \"flip2\" (FLIP protocol version 2) is for Xmega devices.\n" "%s For AT90USB* or ATmega*U* devices, use \"flip1\".\n" "%s (Use -F to bypass this check.)\n", diff --git a/src/ft245r.c b/src/ft245r.c index 9048cc2f..a44e19b8 100644 --- a/src/ft245r.c +++ b/src/ft245r.c @@ -343,7 +343,7 @@ static int ft245r_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) { unsigned char cmd[4] = {0,0,0,0}; unsigned char res[4]; - if (p->flags & AVRPART_HAS_TPI) + if (p->prog_modes & PM_TPI) return avr_tpi_chip_erase(pgm, p); if (p->op[AVR_OP_CHIP_ERASE] == NULL) { @@ -502,7 +502,7 @@ static int ft245r_program_enable(const PROGRAMMER *pgm, const AVRPART *p) { unsigned char res[4]; int i; - if (p->flags & AVRPART_HAS_TPI) + if (p->prog_modes & PM_TPI) return avr_tpi_program_enable(pgm, p, TPIPCR_GT_0b); if (p->op[AVR_OP_PGM_ENABLE] == NULL) { @@ -565,7 +565,7 @@ static int ft245r_initialize(const PROGRAMMER *pgm, const AVRPART *p) { */ ft245r_usleep(pgm, 20000); // 20ms - if (p->flags & AVRPART_HAS_TPI) { + if (p->prog_modes & PM_TPI) { bool io_link_ok = true; uint8_t byte; int i; diff --git a/src/jtag3.c b/src/jtag3.c index 94b2b695..52cbac40 100644 --- a/src/jtag3.c +++ b/src/jtag3.c @@ -1064,19 +1064,19 @@ static int jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { if (pgm->flag & PGM_FL_IS_DW) { ifname = "debugWire"; - if (p->flags & AVRPART_HAS_DW) + if (p->prog_modes & PM_debugWIRE) conn = PARM3_CONN_DW; } else if (pgm->flag & PGM_FL_IS_PDI) { ifname = "PDI"; - if (p->flags & AVRPART_HAS_PDI) + if (p->prog_modes & PM_PDI) conn = PARM3_CONN_PDI; } else if (pgm->flag & PGM_FL_IS_UPDI) { ifname = "UPDI"; - if (p->flags & AVRPART_HAS_UPDI) + if (p->prog_modes & PM_UPDI) conn = PARM3_CONN_UPDI; } else { ifname = "JTAG"; - if (p->flags & AVRPART_HAS_JTAG) + if (p->prog_modes & PM_JTAG) conn = PARM3_CONN_JTAG; } @@ -1086,11 +1086,11 @@ static int jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { return -1; } - if (p->flags & AVRPART_HAS_PDI) + if (p->prog_modes & PM_PDI) parm[0] = PARM3_ARCH_XMEGA; - else if (p->flags & AVRPART_HAS_UPDI) + else if (p->prog_modes & PM_UPDI) parm[0] = PARM3_ARCH_UPDI; - else if (p->flags & AVRPART_HAS_DW) + else if (p->prog_modes & PM_debugWIRE) parm[0] = PARM3_ARCH_TINY; else parm[0] = PARM3_ARCH_MEGA; @@ -1108,7 +1108,7 @@ static int jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { if (conn == PARM3_CONN_PDI || conn == PARM3_CONN_UPDI) PDATA(pgm)->set_sck = jtag3_set_sck_xmega_pdi; else if (conn == PARM3_CONN_JTAG) { - if (p->flags & AVRPART_HAS_PDI) + if (p->prog_modes & PM_PDI) PDATA(pgm)->set_sck = jtag3_set_sck_xmega_jtag; else PDATA(pgm)->set_sck = jtag3_set_sck_mega_jtag; @@ -1137,7 +1137,7 @@ static int jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { } /* set device descriptor data */ - if ((p->flags & AVRPART_HAS_PDI)) + if ((p->prog_modes & PM_PDI)) { struct xmega_device_desc xd; LNODEID ln; @@ -1182,7 +1182,7 @@ static int jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { if (jtag3_setparm(pgm, SCOPE_AVR, 2, PARM3_DEVICEDESC, (unsigned char *)&xd, sizeof xd) < 0) return -1; } - else if ((p->flags & AVRPART_HAS_UPDI)) + else if ((p->prog_modes & PM_UPDI)) { struct updi_device_desc xd; LNODEID ln; @@ -1247,7 +1247,7 @@ static int jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { // Generate UPDI high-voltage pulse if user asks for it and hardware supports it LNODEID support; - if (p->flags & AVRPART_HAS_UPDI && + if (p->prog_modes & PM_UPDI && PDATA(pgm)->use_hvupdi == true && p->hvupdi_variant != HV_UPDI_VARIANT_1) { parm[0] = PARM3_UPDI_HV_NONE; @@ -1332,7 +1332,7 @@ static int jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { int ocdrev; /* lacking a proper definition, guess the OCD revision */ - if (p->flags & AVRPART_HAS_DW) + if (p->prog_modes & PM_debugWIRE) ocdrev = 1; /* exception: ATtiny13, 2313, 4313 */ else if (flashsize > 128 * 1024) ocdrev = 4; @@ -1376,7 +1376,7 @@ static int jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { } if (use_ext_reset > 1) { - if(strcmp(pgm->type, "JTAGICE3") == 0 && p->flags & AVRPART_HAS_JTAG) + if(strcmp(pgm->type, "JTAGICE3") == 0 && (p->prog_modes & PM_JTAG)) avrdude_message(MSG_INFO, "%s: JTAGEN fuse disabled?\n", progname); return -1; } @@ -1394,7 +1394,7 @@ static int jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { * doesn't apply here anyway), the response is just RSP_OK. */ if (resp[1] == RSP3_DATA && status >= 7) { - if (p->flags & AVRPART_HAS_UPDI) { + if (p->prog_modes & PM_UPDI) { /* Partial Family_ID has been returned */ avrdude_message(MSG_NOTICE, "%s: Partial Family_ID returned: \"%c%c%c%c\"\n", progname, resp[3], resp[4], resp[5], resp[6]); @@ -1408,11 +1408,8 @@ static int jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { free(resp); PDATA(pgm)->boot_start = ULONG_MAX; - if ((p->flags & AVRPART_HAS_PDI)) { - /* - * Find out where the border between application and boot area - * is. - */ + if (p->prog_modes & PM_PDI) { + // Find the border between application and boot area AVRMEM *bootmem = avr_locate_mem(p, "boot"); AVRMEM *flashmem = avr_locate_mem(p, "flash"); if (bootmem == NULL || flashmem == NULL) { @@ -1690,7 +1687,7 @@ static int jtag3_page_erase(const PROGRAMMER *pgm, const AVRPART *p, const AVRME avrdude_message(MSG_NOTICE2, "%s: jtag3_page_erase(.., %s, 0x%x)\n", progname, m->desc, addr); - if (!(p->flags & AVRPART_HAS_PDI)) { + if (!(p->prog_modes & PM_PDI)) { avrdude_message(MSG_INFO, "%s: jtag3_page_erase: not an Xmega device\n", progname); return -1; @@ -1764,7 +1761,7 @@ static int jtag3_paged_write(const PROGRAMMER *pgm, const AVRPART *p, const AVRM if (strcmp(m->desc, "flash") == 0) { PDATA(pgm)->flash_pageaddr = (unsigned long)-1L; cmd[3] = jtag3_memtype(pgm, p, addr); - if (p->flags & AVRPART_HAS_PDI) + if (p->prog_modes & PM_PDI) /* dynamically decide between flash/boot memtype */ dynamic_memtype = 1; } else if (strcmp(m->desc, "eeprom") == 0) { @@ -1783,14 +1780,14 @@ static int jtag3_paged_write(const PROGRAMMER *pgm, const AVRPART *p, const AVRM free(cmd); return n_bytes; } - cmd[3] = ( p->flags & AVRPART_HAS_PDI || p->flags & AVRPART_HAS_UPDI ) ? MTYPE_EEPROM_XMEGA : MTYPE_EEPROM_PAGE; + cmd[3] = p->prog_modes & (PM_PDI | PM_UPDI)? MTYPE_EEPROM_XMEGA: MTYPE_EEPROM_PAGE; PDATA(pgm)->eeprom_pageaddr = (unsigned long)-1L; } else if (strcmp(m->desc, "usersig") == 0 || strcmp(m->desc, "userrow") == 0) { cmd[3] = MTYPE_USERSIG; } else if (strcmp(m->desc, "boot") == 0) { cmd[3] = MTYPE_BOOT_FLASH; - } else if ( p->flags & AVRPART_HAS_PDI || p->flags & AVRPART_HAS_UPDI ) { + } else if (p->prog_modes & (PM_PDI | PM_UPDI)) { cmd[3] = MTYPE_FLASH; } else { cmd[3] = MTYPE_SPM; @@ -1868,11 +1865,11 @@ static int jtag3_paged_load(const PROGRAMMER *pgm, const AVRPART *p, const AVRME if (strcmp(m->desc, "flash") == 0) { cmd[3] = jtag3_memtype(pgm, p, addr); - if (p->flags & AVRPART_HAS_PDI) + if (p->prog_modes & PM_PDI) /* dynamically decide between flash/boot memtype */ dynamic_memtype = 1; } else if (strcmp(m->desc, "eeprom") == 0) { - cmd[3] = ( p->flags & AVRPART_HAS_PDI || p->flags & AVRPART_HAS_UPDI ) ? MTYPE_EEPROM : MTYPE_EEPROM_PAGE; + cmd[3] = p->prog_modes & (PM_PDI | PM_UPDI)? MTYPE_EEPROM: MTYPE_EEPROM_PAGE; if (pgm->flag & PGM_FL_IS_DW) return -1; } else if (strcmp(m->desc, "prodsig") == 0) { @@ -1882,9 +1879,9 @@ static int jtag3_paged_load(const PROGRAMMER *pgm, const AVRPART *p, const AVRME cmd[3] = MTYPE_USERSIG; } else if (strcmp(m->desc, "boot") == 0) { cmd[3] = MTYPE_BOOT_FLASH; - } else if ( p->flags & AVRPART_HAS_PDI ) { + } else if (p->prog_modes & PM_PDI) { cmd[3] = MTYPE_FLASH; - } else if ( p->flags & AVRPART_HAS_UPDI ) { + } else if (p->prog_modes & PM_UPDI) { cmd[3] = MTYPE_SRAM; } else { cmd[3] = MTYPE_SPM; @@ -1949,7 +1946,7 @@ static int jtag3_read_byte(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM cmd[1] = CMD3_READ_MEMORY; cmd[2] = 0; - cmd[3] = ( p->flags & AVRPART_HAS_PDI || p->flags & AVRPART_HAS_UPDI ) ? MTYPE_FLASH : MTYPE_FLASH_PAGE; + cmd[3] = p->prog_modes & (PM_PDI | PM_UPDI)? MTYPE_FLASH: MTYPE_FLASH_PAGE; if (avr_mem_is_flash_type(mem)) { addr += mem->offset & (512 * 1024 - 1); /* max 512 KiB flash */ pagesize = PDATA(pgm)->flash_pagesize; @@ -1957,7 +1954,7 @@ static int jtag3_read_byte(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM paddr_ptr = &PDATA(pgm)->flash_pageaddr; cache_ptr = PDATA(pgm)->flash_pagecache; } else if (avr_mem_is_eeprom_type(mem)) { - if ( (pgm->flag & PGM_FL_IS_DW) || ( p->flags & AVRPART_HAS_PDI ) || ( p->flags & AVRPART_HAS_UPDI ) ) { + if ( (pgm->flag & PGM_FL_IS_DW) || (p->prog_modes & PM_PDI) || (p->prog_modes & PM_UPDI) ) { cmd[3] = MTYPE_EEPROM; } else { cmd[3] = MTYPE_EEPROM_PAGE; @@ -1987,7 +1984,7 @@ static int jtag3_read_byte(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM unsupp = 1; } else if (matches(mem->desc, "fuse")) { cmd[3] = MTYPE_FUSE_BITS; - if (!(p->flags & AVRPART_HAS_UPDI)) + if (!(p->prog_modes & PM_UPDI)) addr = mem->offset & 7; } else if (strcmp(mem->desc, "usersig") == 0 || strcmp(mem->desc, "userrow") == 0) { @@ -2117,7 +2114,7 @@ static int jtag3_write_byte(const PROGRAMMER *pgm, const AVRPART *p, const AVRME cmd[0] = SCOPE_AVR; cmd[1] = CMD3_WRITE_MEMORY; cmd[2] = 0; - cmd[3] = ( p->flags & AVRPART_HAS_PDI || p->flags & AVRPART_HAS_UPDI ) ? MTYPE_FLASH : MTYPE_SPM; + cmd[3] = p->prog_modes & (PM_PDI | PM_UPDI)? MTYPE_FLASH: MTYPE_SPM; if (strcmp(mem->desc, "flash") == 0) { cache_ptr = PDATA(pgm)->flash_pagecache; pagesize = PDATA(pgm)->flash_pagesize; @@ -2149,7 +2146,7 @@ static int jtag3_write_byte(const PROGRAMMER *pgm, const AVRPART *p, const AVRME unsupp = 1; } else if (matches(mem->desc, "fuse")) { cmd[3] = MTYPE_FUSE_BITS; - if (!(p->flags & AVRPART_HAS_UPDI)) + if (!(p->prog_modes & PM_UPDI)) addr = mem->offset & 7; } else if (strcmp(mem->desc, "usersig") == 0 || strcmp(mem->desc, "userrow") == 0) { @@ -2457,7 +2454,7 @@ static void jtag3_print_parms(const PROGRAMMER *pgm) { } static unsigned char jtag3_memtype(const PROGRAMMER *pgm, const AVRPART *p, unsigned long addr) { - if ( p->flags & AVRPART_HAS_PDI ) { + if (p->prog_modes & PM_PDI) { if (addr >= PDATA(pgm)->boot_start) return MTYPE_BOOT_FLASH; else @@ -2468,7 +2465,7 @@ static unsigned char jtag3_memtype(const PROGRAMMER *pgm, const AVRPART *p, unsi } static unsigned int jtag3_memaddr(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m, unsigned long addr) { - if ((p->flags & AVRPART_HAS_PDI) != 0) { + if (p->prog_modes & PM_PDI) { if (addr >= PDATA(pgm)->boot_start) /* * all memories but "flash" are smaller than boot_start anyway, so @@ -2479,10 +2476,9 @@ static unsigned int jtag3_memaddr(const PROGRAMMER *pgm, const AVRPART *p, const /* normal flash, or anything else */ return addr; } - /* - * Non-Xmega device. - */ - if (p->flags & AVRPART_HAS_UPDI) { + + // Non-Xmega device + if (p->prog_modes & PM_UPDI) { if (strcmp(m->desc, "flash") == 0) { return addr; } diff --git a/src/jtagmkI.c b/src/jtagmkI.c index a9b2dda8..73c58086 100644 --- a/src/jtagmkI.c +++ b/src/jtagmkI.c @@ -523,7 +523,7 @@ static int jtagmkI_initialize(const PROGRAMMER *pgm, const AVRPART *p) { unsigned char cmd[1], resp[5]; unsigned char b; - if (!(p->flags & AVRPART_HAS_JTAG)) { + if (!(p->prog_modes & PM_JTAG)) { avrdude_message(MSG_INFO, "%s: jtagmkI_initialize(): part %s has no JTAG interface\n", progname, p->desc); return -1; diff --git a/src/jtagmkII.c b/src/jtagmkII.c index f4323799..e3f7d3d7 100644 --- a/src/jtagmkII.c +++ b/src/jtagmkII.c @@ -882,7 +882,7 @@ static int jtagmkII_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) { int status, len; unsigned char buf[6], *resp, c; - if (p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI)) { + if (p->prog_modes & (PM_PDI | PM_UPDI)) { buf[0] = CMND_XMEGA_ERASE; buf[1] = XMEGA_ERASE_CHIP; memset(buf + 2, 0, 4); /* address of area to be erased */ @@ -893,7 +893,7 @@ static int jtagmkII_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) { } avrdude_message(MSG_NOTICE2, "%s: jtagmkII_chip_erase(): Sending %schip erase command: ", progname, - (p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI))? "Xmega ": ""); + p->prog_modes & (PM_PDI | PM_UPDI)? "Xmega ": ""); jtagmkII_send(pgm, buf, len); status = jtagmkII_recv(pgm, &resp); @@ -919,7 +919,7 @@ static int jtagmkII_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) { return -1; } - if (!(p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI))) + if (!(p->prog_modes & (PM_PDI | PM_UPDI))) pgm->initialize(pgm, p); return 0; @@ -966,7 +966,7 @@ static void jtagmkII_set_devdescr(const PROGRAMMER *pgm, const AVRPART *p) { u32_to_b4(sendbuf.dd.ulFlashSize, m->size); u16_to_b2(sendbuf.dd.uiFlashPageSize, m->page_size); u16_to_b2(sendbuf.dd.uiFlashpages, m->size / m->page_size); - if (p->flags & AVRPART_HAS_DW) { + if (p->prog_modes & PM_debugWIRE) { memcpy(sendbuf.dd.ucFlashInst, p->flash_instr, FLASH_INSTR_SIZE); memcpy(sendbuf.dd.ucEepromInst, p->eeprom_instr, EEPROM_INSTR_SIZE); } @@ -975,7 +975,7 @@ static void jtagmkII_set_devdescr(const PROGRAMMER *pgm, const AVRPART *p) { } } sendbuf.dd.ucCacheType = - (p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI))? 0x02 /* ATxmega */: 0x00; + p->prog_modes & (PM_PDI | PM_UPDI)? 0x02 /* ATxmega */: 0x00; avrdude_message(MSG_NOTICE2, "%s: jtagmkII_set_devdescr(): " "Sending set device descriptor command: ", @@ -1290,8 +1290,8 @@ static int jtagmkII_initialize(const PROGRAMMER *pgm, const AVRPART *p) { const char *ifname; /* Abort and print error if programmer does not support the target microcontroller */ - if ((strncmp(pgm->type, "JTAGMKII_UPDI", strlen("JTAGMKII_UPDI")) == 0 && !(p->flags & AVRPART_HAS_UPDI)) || - (strncmp(ldata(lfirst(pgm->id)), "jtagmkII", strlen("jtagmkII")) == 0 && p->flags & AVRPART_HAS_UPDI)) { + if ((strncmp(pgm->type, "JTAGMKII_UPDI", strlen("JTAGMKII_UPDI")) == 0 && !(p->prog_modes & PM_UPDI)) || + (strncmp(ldata(lfirst(pgm->id)), "jtagmkII", strlen("jtagmkII")) == 0 && (p->prog_modes & PM_UPDI))) { avrdude_message(MSG_INFO, "ERROR: programmer %s does not support target %s\n\n", ldata(lfirst(pgm->id)), p->desc); return -1; @@ -1300,15 +1300,15 @@ static int jtagmkII_initialize(const PROGRAMMER *pgm, const AVRPART *p) { ok = 0; if (pgm->flag & PGM_FL_IS_DW) { ifname = "debugWire"; - if (p->flags & AVRPART_HAS_DW) + if (p->prog_modes & PM_debugWIRE) ok = 1; } else if (pgm->flag & PGM_FL_IS_PDI) { ifname = "PDI"; - if (p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI)) + if (p->prog_modes & (PM_PDI | PM_UPDI)) ok = 1; } else { ifname = "JTAG"; - if (p->flags & AVRPART_HAS_JTAG) + if (p->prog_modes & PM_JTAG) ok = 1; } @@ -1350,24 +1350,21 @@ static int jtagmkII_initialize(const PROGRAMMER *pgm, const AVRPART *p) { * mode from JTAG to JTAG_XMEGA. */ if ((pgm->flag & PGM_FL_IS_JTAG) && - (p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI))) { + (p->prog_modes & (PM_PDI | PM_UPDI))) { if (jtagmkII_getsync(pgm, EMULATOR_MODE_JTAG_XMEGA) < 0) return -1; } /* * Must set the device descriptor before entering programming mode. */ - if (PDATA(pgm)->fwver >= 0x700 && (p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI)) != 0) + if (PDATA(pgm)->fwver >= 0x700 && (p->prog_modes & (PM_PDI | PM_UPDI)) != 0) jtagmkII_set_xmega_params(pgm, p); else jtagmkII_set_devdescr(pgm, p); PDATA(pgm)->boot_start = ULONG_MAX; - if ((p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI))) { - /* - * Find out where the border between application and boot area - * is. - */ + if ((p->prog_modes & (PM_PDI | PM_UPDI))) { + // Find the border between application and boot area AVRMEM *bootmem = avr_locate_mem(p, "boot"); AVRMEM *flashmem = avr_locate_mem(p, "flash"); if (bootmem == NULL || flashmem == NULL) { @@ -1405,7 +1402,7 @@ static int jtagmkII_initialize(const PROGRAMMER *pgm, const AVRPART *p) { } PDATA(pgm)->flash_pageaddr = PDATA(pgm)->eeprom_pageaddr = (unsigned long)-1L; - if (PDATA(pgm)->fwver >= 0x700 && (p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI))) { + if (PDATA(pgm)->fwver >= 0x700 && (p->prog_modes & (PM_PDI | PM_UPDI))) { /* * Work around for * https://savannah.nongnu.org/bugs/index.php?37942 @@ -1422,7 +1419,7 @@ static int jtagmkII_initialize(const PROGRAMMER *pgm, const AVRPART *p) { return -1; } - if ((pgm->flag & PGM_FL_IS_JTAG) && !(p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI))) { + if ((pgm->flag & PGM_FL_IS_JTAG) && !(p->prog_modes & (PM_PDI | PM_UPDI))) { hfuse.desc = cache_string("hfuse"); if (jtagmkII_read_byte(pgm, p, &hfuse, 1, &b) < 0) return -1; @@ -1887,7 +1884,7 @@ static int jtagmkII_page_erase(const PROGRAMMER *pgm, const AVRPART *p, const AV avrdude_message(MSG_NOTICE2, "%s: jtagmkII_page_erase(.., %s, 0x%x)\n", progname, m->desc, addr); - if (!(p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI))) { + if (!(p->prog_modes & (PM_PDI | PM_UPDI))) { avrdude_message(MSG_INFO, "%s: jtagmkII_page_erase: not an Xmega device\n", progname); return -1; @@ -2002,7 +1999,7 @@ static int jtagmkII_paged_write(const PROGRAMMER *pgm, const AVRPART *p, const A if (strcmp(m->desc, "flash") == 0) { PDATA(pgm)->flash_pageaddr = (unsigned long)-1L; cmd[1] = jtagmkII_memtype(pgm, p, addr); - if (p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI)) + if (p->prog_modes & (PM_PDI | PM_UPDI)) /* dynamically decide between flash/boot memtype */ dynamic_memtype = 1; } else if (strcmp(m->desc, "eeprom") == 0) { @@ -2021,14 +2018,14 @@ static int jtagmkII_paged_write(const PROGRAMMER *pgm, const AVRPART *p, const A free(cmd); return n_bytes; } - cmd[1] = (p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI)) ? MTYPE_EEPROM : MTYPE_EEPROM_PAGE; + cmd[1] = p->prog_modes & (PM_PDI | PM_UPDI)? MTYPE_EEPROM: MTYPE_EEPROM_PAGE; PDATA(pgm)->eeprom_pageaddr = (unsigned long)-1L; } else if (strcmp(m->desc, "usersig") == 0 || strcmp(m->desc, "userrow") == 0) { cmd[1] = MTYPE_USERSIG; } else if (strcmp(m->desc, "boot") == 0) { cmd[1] = MTYPE_BOOT_FLASH; - } else if (p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI)) { + } else if (p->prog_modes & (PM_PDI | PM_UPDI)) { cmd[1] = MTYPE_FLASH; } else { cmd[1] = MTYPE_SPM; @@ -2130,11 +2127,11 @@ static int jtagmkII_paged_load(const PROGRAMMER *pgm, const AVRPART *p, const AV cmd[0] = CMND_READ_MEMORY; if (strcmp(m->desc, "flash") == 0) { cmd[1] = jtagmkII_memtype(pgm, p, addr); - if (p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI)) + if (p->prog_modes & (PM_PDI | PM_UPDI)) /* dynamically decide between flash/boot memtype */ dynamic_memtype = 1; } else if (strcmp(m->desc, "eeprom") == 0) { - cmd[1] = (p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI)) ? MTYPE_EEPROM : MTYPE_EEPROM_PAGE; + cmd[1] = p->prog_modes & (PM_PDI | PM_UPDI)? MTYPE_EEPROM: MTYPE_EEPROM_PAGE; if (pgm->flag & PGM_FL_IS_DW) return -1; } else if (strcmp(m->desc, "prodsig") == 0) { @@ -2144,7 +2141,7 @@ static int jtagmkII_paged_load(const PROGRAMMER *pgm, const AVRPART *p, const AV cmd[1] = MTYPE_USERSIG; } else if (strcmp(m->desc, "boot") == 0) { cmd[1] = MTYPE_BOOT_FLASH; - } else if (p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI)) { + } else if (p->prog_modes & (PM_PDI | PM_UPDI)) { cmd[1] = MTYPE_FLASH; } else { cmd[1] = MTYPE_SPM; @@ -2230,14 +2227,14 @@ static int jtagmkII_read_byte(const PROGRAMMER *pgm, const AVRPART *p, const AVR unsupp = 0; addr += mem->offset; - cmd[1] = ( p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI) ) ? MTYPE_FLASH : MTYPE_FLASH_PAGE; + cmd[1] = p->prog_modes & (PM_PDI | PM_UPDI)? MTYPE_FLASH: MTYPE_FLASH_PAGE; if (avr_mem_is_flash_type(mem)) { pagesize = PDATA(pgm)->flash_pagesize; paddr = addr & ~(pagesize - 1); paddr_ptr = &PDATA(pgm)->flash_pageaddr; cache_ptr = PDATA(pgm)->flash_pagecache; } else if (avr_mem_is_eeprom_type(mem)) { - if ( (pgm->flag & PGM_FL_IS_DW) || ( p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI) ) ) { + if ( (pgm->flag & PGM_FL_IS_DW) || (p->prog_modes & (PM_PDI | PM_UPDI)) ) { /* debugWire cannot use page access for EEPROM */ cmd[1] = MTYPE_EEPROM; } else { @@ -2404,7 +2401,7 @@ static int jtagmkII_write_byte(const PROGRAMMER *pgm, const AVRPART *p, const AV writedata = data; cmd[0] = CMND_WRITE_MEMORY; - cmd[1] = ( p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI) ) ? MTYPE_FLASH : MTYPE_SPM; + cmd[1] = p->prog_modes & (PM_PDI | PM_UPDI)? MTYPE_FLASH: MTYPE_SPM; if (strcmp(mem->desc, "flash") == 0) { if ((addr & 1) == 1) { /* odd address = high byte */ @@ -2418,7 +2415,7 @@ static int jtagmkII_write_byte(const PROGRAMMER *pgm, const AVRPART *p, const AV if (pgm->flag & PGM_FL_IS_DW) unsupp = 1; } else if (strcmp(mem->desc, "eeprom") == 0) { - cmd[1] = ( p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI) ) ? MTYPE_EEPROM_XMEGA: MTYPE_EEPROM; + cmd[1] = p->prog_modes & (PM_PDI | PM_UPDI)? MTYPE_EEPROM_XMEGA: MTYPE_EEPROM; need_progmode = 0; PDATA(pgm)->eeprom_pageaddr = (unsigned long)-1L; } else if (strcmp(mem->desc, "lfuse") == 0) { @@ -2719,7 +2716,7 @@ static void jtagmkII_print_parms(const PROGRAMMER *pgm) { } static unsigned char jtagmkII_memtype(const PROGRAMMER *pgm, const AVRPART *p, unsigned long addr) { - if ( p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI) ) { + if (p->prog_modes & (PM_PDI | PM_UPDI)) { if (addr >= PDATA(pgm)->boot_start) return MTYPE_BOOT_FLASH; else @@ -2734,7 +2731,7 @@ static unsigned int jtagmkII_memaddr(const PROGRAMMER *pgm, const AVRPART *p, co * Xmega devices handled by V7+ firmware don't want to be told their * m->offset within the write memory command. */ - if (PDATA(pgm)->fwver >= 0x700 && (p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_UPDI)) != 0) { + if (PDATA(pgm)->fwver >= 0x700 && (p->prog_modes & (PM_PDI | PM_UPDI))) { if (addr >= PDATA(pgm)->boot_start) /* * all memories but "flash" are smaller than boot_start anyway, so @@ -3572,7 +3569,7 @@ static int jtagmkII_paged_write32(const PROGRAMMER *pgm, const AVRPART *p, const } // Init SMC and set clocks - if(!(p->flags & FLAGS32_INIT_SMC)) { + if(!(PDATA(pgm)->flags32 & FLAGS32_INIT_SMC)) { status = jtagmkII_smc_init32(pgm); if(status != 0) {lineno = __LINE__; goto eRR;} // PLL 0 PDATA(pgm)->flags32 |= FLAGS32_INIT_SMC; diff --git a/src/libavrdude.h b/src/libavrdude.h index c99117f4..3c7a6aec 100644 --- a/src/libavrdude.h +++ b/src/libavrdude.h @@ -184,19 +184,13 @@ typedef struct opcode { } OPCODE; -/* Any changes here, please also reflect in dev_part_strct() of developer_opts.c */ -#define AVRPART_SERIALOK 0x0001 /* part supports serial programming */ -#define AVRPART_PARALLELOK 0x0002 /* part supports parallel programming */ -#define AVRPART_PSEUDOPARALLEL 0x0004 /* part has pseudo parallel support */ -#define AVRPART_HAS_JTAG 0x0008 /* part has a JTAG i/f */ -#define AVRPART_ALLOWFULLPAGEBITSTREAM 0x0010 /* JTAG ICE mkII param. */ -#define AVRPART_ENABLEPAGEPROGRAMMING 0x0020 /* JTAG ICE mkII param. */ -#define AVRPART_HAS_DW 0x0040 /* part has a debugWire i/f */ -#define AVRPART_HAS_PDI 0x0080 /* part has PDI i/f rather than ISP (ATxmega) */ -#define AVRPART_AVR32 0x0100 /* part is in AVR32 family */ -#define AVRPART_HAS_TPI 0x0800 /* part has TPI i/f rather than ISP (ATtiny4/5/9/10) */ -#define AVRPART_IS_AT90S1200 0x1000 /* part is an AT90S1200 (needs special treatment) */ -#define AVRPART_HAS_UPDI 0x2000 /* part has UPDI i/f (AVR8X) */ +// Any changes here, please also reflect in dev_part_strct() of developer_opts.c +#define AVRPART_SERIALOK 1 // Part supports serial programming +#define AVRPART_PARALLELOK 2 // Part supports parallel programming +#define AVRPART_PSEUDOPARALLEL 4 // Part has pseudo parallel support +#define AVRPART_ALLOWFULLPAGEBITSTREAM 8 // JTAG ICE mkII param +#define AVRPART_ENABLEPAGEPROGRAMMING 16 // JTAG ICE mkII param +#define AVRPART_IS_AT90S1200 32 // Part is an AT90S1200, needs special treatment // Programming modes for parts and programmers: reflect changes in lexer.l, developer_opts.c and config.c #define PM_SPM 1 // Bootloaders, self-programming with SPM opcodes or NVM Controllers diff --git a/src/linuxspi.c b/src/linuxspi.c index df57c7e6..512755e3 100644 --- a/src/linuxspi.c +++ b/src/linuxspi.c @@ -270,8 +270,8 @@ static void linuxspi_display(const PROGRAMMER* pgm, const char* p) { static int linuxspi_initialize(const PROGRAMMER *pgm, const AVRPART *p) { int tries, ret; - if (p->flags & AVRPART_HAS_TPI) { - /* We do not support tpi. This is a dedicated SPI thing */ + if (p->prog_modes & PM_TPI) { + /* We do not support TPI. This is a dedicated SPI thing */ avrdude_message(MSG_INFO, "%s: error: Programmer " LINUXSPI " does not support TPI\n", progname); return -1; } diff --git a/src/main.c b/src/main.c index 51dbc879..1e39fdbf 100644 --- a/src/main.c +++ b/src/main.c @@ -924,7 +924,7 @@ int main(int argc, char * argv []) for (ln=lfirst(updates); ln; ln=lnext(ln)) { upd = ldata(ln); if (upd->memtype == NULL) { - const char *mtype = (p->flags & AVRPART_HAS_PDI)? "application": "flash"; + const char *mtype = p->prog_modes & PM_PDI? "application": "flash"; avrdude_message(MSG_NOTICE2, "%s: defaulting memtype in -U %c:%s option to \"%s\"\n", progname, (upd->op == DEVICE_READ)? 'r': (upd->op == DEVICE_WRITE)? 'w': 'v', @@ -1062,7 +1062,7 @@ int main(int argc, char * argv []) * against 0xffffff / 0x000000 should ensure that the signature bytes * are valid. */ - if(!(p->flags & AVRPART_AVR32)) { + if(!(p->prog_modes & PM_aWire)) { // not AVR32 int attempt = 0; int waittime = 10000; /* 10 ms */ @@ -1071,7 +1071,7 @@ int main(int argc, char * argv []) if (init_ok) { rc = avr_signature(pgm, p); if (rc != LIBAVRDUDE_SUCCESS) { - if ((rc == LIBAVRDUDE_SOFTFAIL) && (p->flags & AVRPART_HAS_UPDI) && (attempt < 1)) { + if (rc == LIBAVRDUDE_SOFTFAIL && (p->prog_modes & PM_UPDI) && attempt < 1) { attempt++; if (pgm->read_sib) { // Read SIB and compare FamilyID @@ -1193,8 +1193,7 @@ int main(int argc, char * argv []) } if (uflags & UF_AUTO_ERASE) { - if ((p->flags & AVRPART_HAS_PDI) && pgm->page_erase != NULL && - lsize(updates) > 0) { + if ((p->prog_modes & PM_PDI) && pgm->page_erase && lsize(updates) > 0) { if (quell_progress < 2) { avrdude_message(MSG_INFO, "%s: NOTE: Programmer supports page erase for Xmega devices.\n" "%sEach page will be erased before programming it, but no chip erase is performed.\n" @@ -1203,7 +1202,7 @@ int main(int argc, char * argv []) } } else { AVRMEM * m; - const char *memname = (p->flags & AVRPART_HAS_PDI)? "application": "flash"; + const char *memname = p->prog_modes & PM_PDI? "application": "flash"; uflags &= ~UF_AUTO_ERASE; for (ln=lfirst(updates); ln; ln=lnext(ln)) { diff --git a/src/stk500v2.c b/src/stk500v2.c index bdff4612..37fe2314 100644 --- a/src/stk500v2.c +++ b/src/stk500v2.c @@ -1130,8 +1130,7 @@ retry: break; case PGMTYPE_JTAGICE3: - if (buf[1] == STATUS_CMD_FAILED && - (p->flags & AVRPART_HAS_DW) != 0) { + if (buf[1] == STATUS_CMD_FAILED && (p->prog_modes & PM_debugWIRE)) { unsigned char cmd[4], *resp; /* Try debugWIRE, and MONCON_DISABLE */ @@ -1239,16 +1238,13 @@ static int stk500v2_initialize(const PROGRAMMER *pgm, const AVRPART *p) { if ((PDATA(pgm)->pgmtype == PGMTYPE_STK600 || PDATA(pgm)->pgmtype == PGMTYPE_AVRISP_MKII || PDATA(pgm)->pgmtype == PGMTYPE_JTAGICE_MKII) != 0 - && (p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_TPI)) != 0) { + && (p->prog_modes & (PM_PDI | PM_TPI)) != 0) { /* * This is an ATxmega device, must use XPROG protocol for the * remaining actions. */ - if ((p->flags & AVRPART_HAS_PDI) != 0) { - /* - * Find out where the border between application and boot area - * is. - */ + if (p->prog_modes & PM_PDI) { + // Find the border between application and boot area AVRMEM *bootmem = avr_locate_mem(p, "boot"); AVRMEM *flashmem = avr_locate_mem(p, "flash"); if (bootmem == NULL || flashmem == NULL) { @@ -1320,8 +1316,8 @@ static int stk500v2_jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { LNODEID ln; AVRMEM * m; - if ((p->flags & AVRPART_HAS_PDI) || - (p->flags & AVRPART_HAS_TPI)) { + // FIXME: condition below looks fishy, suspect the code wants !(p->prog_modes & (PM_debugWIRE | PM_JTAG)) + if (p->prog_modes & (PM_PDI | PM_TPI)) { avrdude_message(MSG_INFO, "%s: jtag3_initialize(): part %s has no ISP interface\n", progname, p->desc); return -1; @@ -1330,7 +1326,7 @@ static int stk500v2_jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { PROGRAMMER *pgmcp = pgm_dup(pgm); pgmcp->cookie = PDATA(pgm)->chained_pdata; - if (p->flags & AVRPART_HAS_DW) + if (p->prog_modes & PM_debugWIRE) parm[0] = PARM3_ARCH_TINY; else parm[0] = PARM3_ARCH_MEGA; @@ -1574,7 +1570,7 @@ static void stk500v2_enable(PROGRAMMER *pgm, const AVRPART *p) { if((PDATA(pgm)->pgmtype == PGMTYPE_STK600 || PDATA(pgm)->pgmtype == PGMTYPE_AVRISP_MKII || PDATA(pgm)->pgmtype == PGMTYPE_JTAGICE_MKII) != 0 - && (p->flags & (AVRPART_HAS_PDI | AVRPART_HAS_TPI)) != 0) { + && (p->prog_modes & (PM_PDI | PM_TPI)) != 0) { stk600_setup_xprog(pgm); } else { stk600_setup_isp(pgm); @@ -3689,7 +3685,7 @@ static int stk600_xprog_program_enable(const PROGRAMMER *pgm, const AVRPART *p) AVRMEM *mem = NULL; int use_tpi; - use_tpi = (p->flags & AVRPART_HAS_TPI) != 0; + use_tpi = (p->prog_modes & PM_TPI) != 0; if (!use_tpi) { if (p->nvm_base == 0) { @@ -3825,7 +3821,7 @@ static int stk600_xprog_write_byte(const PROGRAMMER *pgm, const AVRPART *p, cons memcode = XPRG_MEM_TYPE_LOCKBITS; } else if (strncmp(mem->desc, "fuse", strlen("fuse")) == 0) { memcode = XPRG_MEM_TYPE_FUSE; - if (p->flags & AVRPART_HAS_TPI) + if (p->prog_modes & PM_TPI) /* * TPI devices need a mystic erase prior to writing their * fuses. @@ -3855,7 +3851,7 @@ static int stk600_xprog_write_byte(const PROGRAMMER *pgm, const AVRPART *p, cons } } - if (p->flags & AVRPART_HAS_TPI) { + if (p->prog_modes & PM_TPI) { /* * Some TPI memories (configuration aka. fuse) require a * larger write block size. We record that as a blocksize in @@ -4217,7 +4213,7 @@ static int stk600_xprog_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) { AVRMEM *mem; unsigned int addr = 0; - if (p->flags & AVRPART_HAS_TPI) { + if (p->prog_modes & PM_TPI) { if ((mem = avr_locate_mem(p, "flash")) == NULL) { avrdude_message(MSG_INFO, "%s: stk600_xprog_chip_erase(): no FLASH definition found for TPI device\n", progname); diff --git a/src/usbasp.c b/src/usbasp.c index 6a0e00f0..65750dda 100644 --- a/src/usbasp.c +++ b/src/usbasp.c @@ -674,7 +674,7 @@ static int usbasp_initialize(const PROGRAMMER *pgm, const AVRPART *p) { else pdata->capabilities = 0; - pdata->use_tpi = (pdata->capabilities & USBASP_CAP_TPI) && (p->flags & AVRPART_HAS_TPI); + pdata->use_tpi = (pdata->capabilities & USBASP_CAP_TPI) && (p->prog_modes & PM_TPI); // query support for 3 MHz SCK in UsbAsp-flash firmware // https://github.com/nofeletru/UsbAsp-flash pdata->sck_3mhz = ((pdata->capabilities & USBASP_CAP_3MHZ) != 0) ? 1 :0; diff --git a/src/usbtiny.c b/src/usbtiny.c index 5cdaad4a..2e319318 100644 --- a/src/usbtiny.c +++ b/src/usbtiny.c @@ -454,7 +454,7 @@ static int usbtiny_initialize (const PROGRAMMER *pgm, const AVRPART *p ) { // Let the device wake up. usleep(50000); - if (p->flags & AVRPART_HAS_TPI) { + if (p->prog_modes & PM_TPI) { /* Since there is a single TPIDATA line, MOSI and MISO must be linked together through a 1kOhm resistor. Verify that everything we send on MOSI gets mirrored back on MISO. */ @@ -605,7 +605,7 @@ static int usbtiny_spi(const PROGRAMMER *pgm, const unsigned char *cmd, unsigned static int usbtiny_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) { unsigned char res[4]; - if (p->flags & AVRPART_HAS_TPI) + if (p->prog_modes & PM_TPI) return avr_tpi_chip_erase(pgm, p); if (p->op[AVR_OP_CHIP_ERASE] == NULL) { @@ -773,7 +773,7 @@ static int usbtiny_paged_write(const PROGRAMMER *pgm, const AVRPART *p, const AV static int usbtiny_program_enable(const PROGRAMMER *pgm, const AVRPART *p) { unsigned char buf[4]; - if (p->flags & AVRPART_HAS_TPI) + if (p->prog_modes & PM_TPI) return avr_tpi_program_enable(pgm, p, TPIPCR_GT_0b); else return usbtiny_avr_op(pgm, p, AVR_OP_PGM_ENABLE, buf); From 626a43b139b570aa030fabfd3d07b9eeed7df2ea Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Tue, 30 Aug 2022 19:48:17 +0100 Subject: [PATCH 05/11] Add avrintel.[ch] to the project and warn if mcuid incompatible with avrintel.c --- src/CMakeLists.txt | 2 + src/avrdude.conf.in | 3 +- src/avrintel.c | 5447 ++++++++++++++++++++++++++++++++++++++++++ src/avrintel.h | 1477 ++++++++++++ src/avrpart.c | 1 + src/config.c | 40 + src/config.h | 1 + src/config_gram.y | 2 + src/doc/avrdude.texi | 2 +- 9 files changed, 6973 insertions(+), 2 deletions(-) create mode 100644 src/avrintel.c create mode 100644 src/avrintel.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 804468c1..2cb8f5f1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -252,6 +252,8 @@ add_executable(avrdude main.c term.c term.h + avrintel.c + avrintel.h developer_opts.c developer_opts.h developer_opts_private.h diff --git a/src/avrdude.conf.in b/src/avrdude.conf.in index 018850d3..197663ef 100644 --- a/src/avrdude.conf.in +++ b/src/avrdude.conf.in @@ -68,7 +68,7 @@ # id = ; # quoted string # family_id = ; # quoted string, eg, "megaAVR" or "tinyAVR" # prog_modes = PM_ {| PM_} # interfaces, eg, PM_SPM|PM_ISP|PM_HVPP|PM_debugWIRE -# mcuid = ; # unique id in 0..2039 for urclock programmer +# mcuid = ; # unique id in 0..2039 for 8-bit AVRs # n_interrupts = ; # number of interrupts, used for vector bootloaders # n_page_erase = ; # if set, number of pages erased during NVM erase # hvupdi_variant = ; # numeric -1 (n/a) or 0..2 @@ -13169,6 +13169,7 @@ part part parent ".reduced_core_tiny" desc = "ATtiny4"; id = "t4"; + mcuid = 0; n_interrupts = 10; signature = 0x1e 0x8f 0x0a; diff --git a/src/avrintel.c b/src/avrintel.c new file mode 100644 index 00000000..c31b01eb --- /dev/null +++ b/src/avrintel.c @@ -0,0 +1,5447 @@ +/* + * Do not edit: automatically generated by mkavrintel.pl + * + * avrintel.c + * + * Atmel AVR8L, AVR8, XMEGA and AVR8X family description of interrupts and more + * + * published under GNU General Public License, version 3 (GPL-3.0) + * meta-author Stefan Rueger + * + * v 1.1 + * 30.08.2022 + * + */ + +#include "avrintel.h" + +const uPcore_t uP_table[] = { // Value of -1 typically means unknown + //{mcu_name, mcuid, family, {sig, na, ture}, flstart, flsize, pgsiz, nb, bootsz, eestart, eesize, ep, rambeg, ramsiz, nf, nl, ni, isr_names}, // Source + {"ATtiny4", 0, F_AVR8L, {0x1E, 0x8F, 0x0A}, 0, 0x00200, 0x010, 0, 0, 0, 0, 0, 0x0040, 0x0020, 1, 1, 10, vtab_attiny9}, // atdf, avr-gcc 12.2.0, avrdude, boot size (manual) + {"ATtiny5", 1, F_AVR8L, {0x1E, 0x8F, 0x09}, 0, 0x00200, 0x010, 0, 0, 0, 0, 0, 0x0040, 0x0020, 1, 1, 11, vtab_attiny10}, // atdf, avr-gcc 12.2.0, avrdude, boot size (manual) + {"ATtiny9", 2, F_AVR8L, {0x1E, 0x90, 0x08}, 0, 0x00400, 0x010, 0, 0, 0, 0, 0, 0x0040, 0x0020, 1, 1, 10, vtab_attiny9}, // atdf, avr-gcc 12.2.0, avrdude, boot size (manual) + {"ATtiny10", 3, F_AVR8L, {0x1E, 0x90, 0x03}, 0, 0x00400, 0x010, 0, 0, 0, 0, 0, 0x0040, 0x0020, 1, 1, 11, vtab_attiny10}, // atdf, avr-gcc 12.2.0, avrdude, boot size (manual) + {"ATtiny20", 4, F_AVR8L, {0x1E, 0x91, 0x0F}, 0, 0x00800, 0x020, 0, 0, 0, 0, 0, 0x0040, 0x0080, 1, 1, 17, vtab_attiny20}, // atdf, avr-gcc 12.2.0, avrdude, boot size (manual) + {"ATtiny40", 5, F_AVR8L, {0x1E, 0x92, 0x0E}, 0, 0x01000, 0x040, 0, 0, 0, 0, 0, 0x0040, 0x0100, 1, 1, 18, vtab_attiny40}, // atdf, avr-gcc 12.2.0, avrdude, boot size (manual) + {"ATtiny102", 6, F_AVR8L, {0x1E, 0x90, 0x0C}, 0, 0x00400, 0x010, 0, 0, 0, 0, 0, 0x0040, 0x0020, 1, 1, 16, vtab_attiny104}, // atdf, avrdude, boot size (manual) + {"ATtiny104", 7, F_AVR8L, {0x1E, 0x90, 0x0B}, 0, 0x00400, 0x010, 0, 0, 0, 0, 0, 0x0040, 0x0020, 1, 1, 16, vtab_attiny104}, // atdf, avrdude, boot size (manual) + + {"ATtiny11", 8, F_AVR8, {0x1E, 0x90, 0x04}, 0, 0x00400, 0x001, 0, 0, 0, 0x0040, 1, 0x0060, 0x0020, 1, 1, 5, vtab_attiny11}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny12", 9, F_AVR8, {0x1E, 0x90, 0x05}, 0, 0x00400, 0x001, 0, 0, 0, 0x0040, 2, 0x0060, 0x0020, 1, 1, 6, vtab_attiny12}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny13", 10, F_AVR8, {0x1E, 0x90, 0x07}, 0, 0x00400, 0x020, 0, 0, 0, 0x0040, 4, 0x0060, 0x0040, 2, 1, 10, vtab_attiny13a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny13A", 11, F_AVR8, {0x1E, 0x90, 0x07}, 0, 0x00400, 0x020, 0, 0, 0, 0x0040, 4, 0x0060, 0x0040, 2, 1, 10, vtab_attiny13a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny15", 12, F_AVR8, {0x1E, 0x90, 0x06}, 0, 0x00400, 0x001, 0, 0, 0, 0x0040, 2, 0x0060, 0x0020, 1, 1, 9, vtab_attiny15}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny22", 13, F_AVR8, {0x1E, 0x91, 0x06}, 0, 0x00800, -1, -1, -1, -1, -1, -1, 0x0060, 0x0080, 1, 1, 3, vtab_attiny22}, // avr-gcc 12.2.0 + {"ATtiny24", 14, F_AVR8, {0x1E, 0x91, 0x0B}, 0, 0x00800, 0x020, 0, 0, 0, 0x0080, 4, 0x0060, 0x0080, 3, 1, 17, vtab_attiny84a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny24A", 15, F_AVR8, {0x1E, 0x91, 0x0B}, 0, 0x00800, 0x020, 0, 0, 0, 0x0080, 4, 0x0060, 0x0080, 3, 1, 17, vtab_attiny84a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny25", 16, F_AVR8, {0x1E, 0x91, 0x08}, 0, 0x00800, 0x020, 0, 0, 0, 0x0080, 4, 0x0060, 0x0080, 3, 1, 15, vtab_attiny85}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny26", 17, F_AVR8, {0x1E, 0x91, 0x09}, 0, 0x00800, 0x020, 0, 0, 0, 0x0080, 4, 0x0060, 0x0080, 2, 1, 12, vtab_attiny26}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny28", 18, F_AVR8, {0x1E, 0x91, 0x07}, 0, 0x00800, 0x002, 0, 0, 0, 0, 0, 0x0060, 0x0020, 1, 1, 6, vtab_attiny28}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny43U", 19, F_AVR8, {0x1E, 0x92, 0x0C}, 0, 0x01000, 0x040, 0, 0, 0, 0x0040, 4, 0x0060, 0x0100, 3, 1, 16, vtab_attiny43u}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny44", 20, F_AVR8, {0x1E, 0x92, 0x07}, 0, 0x01000, 0x040, 0, 0, 0, 0x0100, 4, 0x0060, 0x0100, 3, 1, 17, vtab_attiny84a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny44A", 21, F_AVR8, {0x1E, 0x92, 0x07}, 0, 0x01000, 0x040, 0, 0, 0, 0x0100, 4, 0x0060, 0x0100, 3, 1, 17, vtab_attiny84a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny45", 22, F_AVR8, {0x1E, 0x92, 0x06}, 0, 0x01000, 0x040, 0, 0, 0, 0x0100, 4, 0x0060, 0x0100, 3, 1, 15, vtab_attiny85}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny48", 23, F_AVR8, {0x1E, 0x92, 0x09}, 0, 0x01000, 0x040, 0, 0, 0, 0x0040, 4, 0x0100, 0x0100, 3, 1, 20, vtab_attiny88}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny84", 24, F_AVR8, {0x1E, 0x93, 0x0C}, 0, 0x02000, 0x040, 0, 0, 0, 0x0200, 4, 0x0060, 0x0200, 3, 1, 17, vtab_attiny84a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny84A", 25, F_AVR8, {0x1E, 0x93, 0x0C}, 0, 0x02000, 0x040, 0, 0, 0, 0x0200, 4, 0x0060, 0x0200, 3, 1, 17, vtab_attiny84a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny85", 26, F_AVR8, {0x1E, 0x93, 0x0B}, 0, 0x02000, 0x040, 0, 0, 0, 0x0200, 4, 0x0060, 0x0200, 3, 1, 15, vtab_attiny85}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny87", 27, F_AVR8, {0x1E, 0x93, 0x87}, 0, 0x02000, 0x080, 0, 0, 0, 0x0200, 4, 0x0100, 0x0200, 3, 1, 20, vtab_attiny167}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny88", 28, F_AVR8, {0x1E, 0x93, 0x11}, 0, 0x02000, 0x040, 0, 0, 0, 0x0040, 4, 0x0100, 0x0200, 3, 1, 20, vtab_attiny88}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny167", 29, F_AVR8, {0x1E, 0x94, 0x87}, 0, 0x04000, 0x080, 0, 0, 0, 0x0200, 4, 0x0100, 0x0200, 3, 1, 20, vtab_attiny167}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny261", 30, F_AVR8, {0x1E, 0x91, 0x0C}, 0, 0x00800, 0x020, 0, 0, 0, 0x0080, 4, 0x0060, 0x0080, 3, 1, 19, vtab_attiny861a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny261A", 31, F_AVR8, {0x1E, 0x91, 0x0C}, 0, 0x00800, 0x020, 0, 0, 0, 0x0080, 4, 0x0060, 0x0080, 3, 1, 19, vtab_attiny861a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny441", 32, F_AVR8, {0x1E, 0x92, 0x15}, 0, 0x01000, 0x010, 0, 0, 0, 0x0100, 4, 0x0100, 0x0100, 3, 1, 30, vtab_attiny841}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny461", 33, F_AVR8, {0x1E, 0x92, 0x08}, 0, 0x01000, 0x040, 0, 0, 0, 0x0100, 4, 0x0060, 0x0100, 3, 1, 19, vtab_attiny861a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny461A", 34, F_AVR8, {0x1E, 0x92, 0x08}, 0, 0x01000, 0x040, 0, 0, 0, 0x0100, 4, 0x0060, 0x0100, 3, 1, 19, vtab_attiny861a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny828", 35, F_AVR8, {0x1E, 0x93, 0x14}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0100, 4, 0x0100, 0x0200, 3, 1, 26, vtab_attiny828}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny828R", 36, F_AVR8, {0x1E, 0x93, 0x14}, 0, 0x02000, 0x040, -1, -1, 0, 0x0100, 4, -1, -1, -1, -1, 0, NULL}, // avrdude + {"ATtiny841", 37, F_AVR8, {0x1E, 0x93, 0x15}, 0, 0x02000, 0x010, 0, 0, 0, 0x0200, 4, 0x0100, 0x0200, 3, 1, 30, vtab_attiny841}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny861", 38, F_AVR8, {0x1E, 0x93, 0x0D}, 0, 0x02000, 0x040, 0, 0, 0, 0x0200, 4, 0x0060, 0x0200, 3, 1, 19, vtab_attiny861a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny861A", 39, F_AVR8, {0x1E, 0x93, 0x0D}, 0, 0x02000, 0x040, 0, 0, 0, 0x0200, 4, 0x0060, 0x0200, 3, 1, 19, vtab_attiny861a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny1634", 40, F_AVR8, {0x1E, 0x94, 0x12}, 0, 0x04000, 0x020, 0, 0, 0, 0x0100, 4, 0x0100, 0x0400, 3, 1, 28, vtab_attiny1634}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny1634R", 41, F_AVR8, {0x1E, 0x94, 0x12}, 0, 0x04000, 0x020, -1, -1, 0, 0x0100, 4, -1, -1, -1, -1, 0, NULL}, // avrdude + {"ATtiny2313", 42, F_AVR8, {0x1E, 0x91, 0x0A}, 0, 0x00800, 0x020, 0, 0, 0, 0x0080, 4, 0x0060, 0x0080, 3, 1, 19, vtab_attiny2313}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny2313A", 43, F_AVR8, {0x1E, 0x91, 0x0A}, 0, 0x00800, 0x020, 0, 0, 0, 0x0080, 4, 0x0060, 0x0080, 3, 1, 21, vtab_attiny4313}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny4313", 44, F_AVR8, {0x1E, 0x92, 0x0D}, 0, 0x01000, 0x040, 0, 0, 0, 0x0100, 4, 0x0060, 0x0100, 3, 1, 21, vtab_attiny4313}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega8", 45, F_AVR8, {0x1E, 0x93, 0x07}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0200, 4, 0x0060, 0x0400, 2, 1, 19, vtab_atmega8a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega8A", 46, F_AVR8, {0x1E, 0x93, 0x07}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0200, 4, 0x0060, 0x0400, 2, 1, 19, vtab_atmega8a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega8HVA", 47, F_AVR8, {0x1E, 0x93, 0x10}, 0, 0x02000, 0x080, 0, 0, 0, 0x0100, 4, 0x0100, 0x0200, 1, 1, 21, vtab_atmega16hva}, // atdf, avr-gcc 12.2.0 + {"ATmega8U2", 48, F_AVR8, {0x1E, 0x93, 0x89}, 0, 0x02000, 0x080, 4, 0x0200, 0, 0x0200, 4, 0x0100, 0x0200, 3, 1, 29, vtab_atmega32u2}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega16", 49, F_AVR8, {0x1E, 0x94, 0x03}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0060, 0x0400, 2, 1, 21, vtab_atmega16a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega16A", 50, F_AVR8, {0x1E, 0x94, 0x03}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0060, 0x0400, 2, 1, 21, vtab_atmega16a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega16HVA", 51, F_AVR8, {0x1E, 0x94, 0x0C}, 0, 0x04000, 0x080, 0, 0, 0, 0x0100, 4, 0x0100, 0x0200, 1, 1, 21, vtab_atmega16hva}, // atdf, avr-gcc 12.2.0 + {"ATmega16HVB", 52, F_AVR8, {0x1E, 0x94, 0x0D}, 0, 0x04000, 0x080, 4, 0x0200, 0, 0x0200, 4, 0x0100, 0x0400, 2, 1, 29, vtab_atmega32hvbrevb}, // atdf, avr-gcc 12.2.0 + {"ATmega16HVBrevB", 53, F_AVR8, {0x1E, 0x94, 0x0D}, 0, 0x04000, 0x080, 4, 0x0200, 0, 0x0200, 4, 0x0100, 0x0400, 2, 1, 29, vtab_atmega32hvbrevb}, // atdf, avr-gcc 12.2.0 + {"ATmega16M1", 54, F_AVR8, {0x1E, 0x94, 0x84}, 0, 0x04000, 0x080, 4, 0x0200, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 31, vtab_atmega64m1}, // atdf, avr-gcc 12.2.0 + {"ATmega16HVA2", 55, F_AVR8, {0x1E, 0x94, 0x0E}, 0, 0x04000, 0x080, -1, -1, -1, -1, -1, 0x0100, 0x0400, 2, 1, 22, vtab_atmega16hva2}, // avr-gcc 12.2.0 + {"ATmega16U2", 56, F_AVR8, {0x1E, 0x94, 0x89}, 0, 0x04000, 0x080, 4, 0x0200, 0, 0x0200, 4, 0x0100, 0x0200, 3, 1, 29, vtab_atmega32u2}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega16U4", 57, F_AVR8, {0x1E, 0x94, 0x88}, 0, 0x04000, 0x080, 4, 0x0200, 0, 0x0200, 4, 0x0100, 0x0500, 3, 1, 43, vtab_atmega32u4}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega32", 58, F_AVR8, {0x1E, 0x95, 0x02}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0060, 0x0800, 2, 1, 21, vtab_atmega323}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega32A", 59, F_AVR8, {0x1E, 0x95, 0x02}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0060, 0x0800, 2, 1, 21, vtab_atmega323}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega32HVB", 60, F_AVR8, {0x1E, 0x95, 0x10}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 2, 1, 29, vtab_atmega32hvbrevb}, // atdf, avr-gcc 12.2.0 + {"ATmega32HVBrevB", 61, F_AVR8, {0x1E, 0x95, 0x10}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 2, 1, 29, vtab_atmega32hvbrevb}, // atdf, avr-gcc 12.2.0 + {"ATmega32C1", 62, F_AVR8, {0x1E, 0x95, 0x86}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 31, vtab_atmega64m1}, // atdf, avr-gcc 12.2.0 + {"ATmega32M1", 63, F_AVR8, {0x1E, 0x95, 0x84}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 31, vtab_atmega64m1}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega32U2", 64, F_AVR8, {0x1E, 0x95, 0x8A}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0400, 3, 1, 29, vtab_atmega32u2}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega32U4", 65, F_AVR8, {0x1E, 0x95, 0x87}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0a00, 3, 1, 43, vtab_atmega32u4}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega32U6", 66, F_AVR8, {0x1E, 0x95, 0x88}, 0, 0x08000, 0x080, 4, 0x0200, -1, -1, -1, 0x0100, 0x0a00, 3, 1, 38, vtab_atmega32u6}, // avr-gcc 12.2.0, boot size (manual) + {"ATmega48", 67, F_AVR8, {0x1E, 0x92, 0x05}, 0, 0x01000, 0x040, 0, 0, 0, 0x0100, 4, 0x0100, 0x0200, 3, 1, 26, vtab_atmega328p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega48A", 68, F_AVR8, {0x1E, 0x92, 0x05}, 0, 0x01000, 0x040, 0, 0, 0, 0x0100, 4, 0x0100, 0x0200, 3, 1, 26, vtab_atmega328p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega48P", 69, F_AVR8, {0x1E, 0x92, 0x0A}, 0, 0x01000, 0x040, 0, 0, 0, 0x0100, 4, 0x0100, 0x0200, 3, 1, 26, vtab_atmega328p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega48PA", 70, F_AVR8, {0x1E, 0x92, 0x0A}, 0, 0x01000, 0x040, 0, 0, 0, 0x0100, 4, 0x0100, 0x0200, 3, 1, 26, vtab_atmega328p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega48PB", 71, F_AVR8, {0x1E, 0x92, 0x10}, 0, 0x01000, 0x040, 0, 0, 0, 0x0100, 4, 0x0100, 0x0200, 3, 1, 27, vtab_atmega168pb}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega64", 72, F_AVR8, {0x1E, 0x96, 0x02}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 35, vtab_atmega128a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega64A", 73, F_AVR8, {0x1E, 0x96, 0x02}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 35, vtab_atmega128a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega64HVE", 74, F_AVR8, {0x1E, 0x96, 0x10}, 0, 0x10000, 0x080, 4, 0x0400, -1, -1, -1, 0x0100, 0x1000, 2, 1, 25, vtab_atmega64hve2}, // avr-gcc 12.2.0, boot size (manual) + {"ATmega64C1", 75, F_AVR8, {0x1E, 0x96, 0x86}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 31, vtab_atmega64m1}, // atdf, avr-gcc 12.2.0 + {"ATmega64M1", 76, F_AVR8, {0x1E, 0x96, 0x84}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 31, vtab_atmega64m1}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega64HVE2", 77, F_AVR8, {0x1E, 0x96, 0x10}, 0, 0x10000, 0x080, 4, 0x0400, 0, 0x0400, 4, 0x0100, 0x1000, 2, 1, 25, vtab_atmega64hve2}, // atdf, avr-gcc 12.2.0 + {"ATmega64RFR2", 78, F_AVR8, {0x1E, 0xA6, 0x02}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0200, 0x2000, 3, 1, 77, vtab_atmega2564rfr2}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega88", 79, F_AVR8, {0x1E, 0x93, 0x0A}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 26, vtab_atmega328p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega88A", 80, F_AVR8, {0x1E, 0x93, 0x0A}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 26, vtab_atmega328p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega88P", 81, F_AVR8, {0x1E, 0x93, 0x0F}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 26, vtab_atmega328p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega88PA", 82, F_AVR8, {0x1E, 0x93, 0x0F}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 26, vtab_atmega328p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega88PB", 83, F_AVR8, {0x1E, 0x93, 0x16}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 27, vtab_atmega168pb}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega103", 84, F_AVR8, {0x1E, 0x97, 0x01}, 0, 0x20000, 0x100, -1, -1, 0, 0x1000, 1, 0x0060, 0x0fa0, 1, 1, 24, vtab_atmega103}, // avr-gcc 12.2.0, avrdude + {"ATmega128", 85, F_AVR8, {0x1E, 0x97, 0x02}, 0, 0x20000, 0x100, 4, 0x0400, 0, 0x1000, 8, 0x0100, 0x1000, 3, 1, 35, vtab_atmega128a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega128A", 86, F_AVR8, {0x1E, 0x97, 0x02}, 0, 0x20000, 0x100, 4, 0x0400, 0, 0x1000, 8, 0x0100, 0x1000, 3, 1, 35, vtab_atmega128a}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega128RFA1", 87, F_AVR8, {0x1E, 0xA7, 0x01}, 0, 0x20000, 0x100, 4, 0x0400, 0, 0x1000, 8, 0x0200, 0x4000, 3, 1, 72, vtab_atmega128rfa1}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega128RFR2", 88, F_AVR8, {0x1E, 0xA7, 0x02}, 0, 0x20000, 0x100, 4, 0x0400, 0, 0x1000, 8, 0x0200, 0x4000, 3, 1, 77, vtab_atmega2564rfr2}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega161", 89, F_AVR8, {0x1E, 0x94, 0x01}, 0, 0x04000, 0x080, 1, 0x0400, 0, 0x0200, 1, 0x0060, 0x0400, 1, 1, 21, vtab_atmega161}, // avr-gcc 12.2.0, avrdude, boot size (manual) + {"ATmega162", 90, F_AVR8, {0x1E, 0x94, 0x04}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 28, vtab_atmega162}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega163", 91, F_AVR8, {0x1E, 0x94, 0x02}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 1, 0x0060, 0x0400, 2, 1, 18, vtab_atmega163}, // avr-gcc 12.2.0, avrdude, boot size (manual) + {"ATmega164A", 92, F_AVR8, {0x1E, 0x94, 0x0F}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 31, vtab_atmega644pa}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega164P", 93, F_AVR8, {0x1E, 0x94, 0x0A}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 31, vtab_atmega644pa}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega164PA", 94, F_AVR8, {0x1E, 0x94, 0x0A}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 31, vtab_atmega644pa}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega165", 95, F_AVR8, {0x1E, 0x94, 0x10}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 22, vtab_atmega645p}, // avr-gcc 12.2.0, avrdude, boot size (manual) + {"ATmega165A", 96, F_AVR8, {0x1E, 0x94, 0x10}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 22, vtab_atmega645p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega165P", 97, F_AVR8, {0x1E, 0x94, 0x07}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 22, vtab_atmega645p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega165PA", 98, F_AVR8, {0x1E, 0x94, 0x07}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 22, vtab_atmega645p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega168", 99, F_AVR8, {0x1E, 0x94, 0x06}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 26, vtab_atmega328}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega168A", 100, F_AVR8, {0x1E, 0x94, 0x06}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 26, vtab_atmega328p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega168P", 101, F_AVR8, {0x1E, 0x94, 0x0B}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 26, vtab_atmega328p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega168PA", 102, F_AVR8, {0x1E, 0x94, 0x0B}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 26, vtab_atmega328p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega168PB", 103, F_AVR8, {0x1E, 0x94, 0x15}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 27, vtab_atmega168pb}, // atdf, avr-gcc 7.3.0, avrdude + {"ATmega169", 104, F_AVR8, {0x1E, 0x94, 0x05}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 23, vtab_atmega649p}, // avr-gcc 12.2.0, avrdude, boot size (manual) + {"ATmega169A", 105, F_AVR8, {0x1E, 0x94, 0x11}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 23, vtab_atmega649p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega169P", 106, F_AVR8, {0x1E, 0x94, 0x05}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 23, vtab_atmega649p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega169PA", 107, F_AVR8, {0x1E, 0x94, 0x05}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 23, vtab_atmega649p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega256RFR2", 108, F_AVR8, {0x1E, 0xA8, 0x02}, 0, 0x40000, 0x100, 4, 0x0400, 0, 0x2000, 8, 0x0200, 0x8000, 3, 1, 77, vtab_atmega2564rfr2}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega323", 109, F_AVR8, {0x1E, 0x95, 0x01}, 0, 0x08000, 0x080, 4, 0x0200, -1, -1, -1, 0x0060, 0x0800, 2, 1, 21, vtab_atmega323}, // avr-gcc 12.2.0, boot size (manual) + {"ATmega324A", 110, F_AVR8, {0x1E, 0x95, 0x15}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 31, vtab_atmega644pa}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega324P", 111, F_AVR8, {0x1E, 0x95, 0x08}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 31, vtab_atmega644pa}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega324PA", 112, F_AVR8, {0x1E, 0x95, 0x11}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 31, vtab_atmega644pa}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega324PB", 113, F_AVR8, {0x1E, 0x95, 0x17}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 51, vtab_atmega324pb}, // atdf, avrdude + {"ATmega325", 114, F_AVR8, {0x1E, 0x95, 0x05}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 22, vtab_atmega645p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega325A", 115, F_AVR8, {0x1E, 0x95, 0x05}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 22, vtab_atmega645p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega325P", 116, F_AVR8, {0x1E, 0x95, 0x0D}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 22, vtab_atmega645p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega325PA", 117, F_AVR8, {0x1E, 0x95, 0x0D}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 22, vtab_atmega645p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega328", 118, F_AVR8, {0x1E, 0x95, 0x14}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 26, vtab_atmega328}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega328P", 119, F_AVR8, {0x1E, 0x95, 0x0F}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 26, vtab_atmega328p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega328PB", 120, F_AVR8, {0x1E, 0x95, 0x16}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 45, vtab_atmega328pb}, // atdf, avr-gcc 7.3.0, avrdude + {"ATmega329", 121, F_AVR8, {0x1E, 0x95, 0x03}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 23, vtab_atmega649p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega329A", 122, F_AVR8, {0x1E, 0x95, 0x03}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 23, vtab_atmega649p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega329P", 123, F_AVR8, {0x1E, 0x95, 0x0B}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 23, vtab_atmega649p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega329PA", 124, F_AVR8, {0x1E, 0x95, 0x0B}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 23, vtab_atmega649p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega406", 125, F_AVR8, {0x1E, 0x95, 0x07}, 0, 0x0a000, 0x080, 4, 0x0200, 0, 0x0200, 4, 0x0100, 0x0800, 2, 1, 23, vtab_atmega406}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega640", 126, F_AVR8, {0x1E, 0x96, 0x08}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x1000, 8, 0x0200, 0x2000, 3, 1, 57, vtab_atmega2561}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega644", 127, F_AVR8, {0x1E, 0x96, 0x09}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 28, vtab_atmega644}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega644A", 128, F_AVR8, {0x1E, 0x96, 0x09}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 31, vtab_atmega644pa}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega644P", 129, F_AVR8, {0x1E, 0x96, 0x0A}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 31, vtab_atmega644pa}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega644PA", 130, F_AVR8, {0x1E, 0x96, 0x0A}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 31, vtab_atmega644pa}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega644RFR2", 131, F_AVR8, {0x1E, 0xA6, 0x03}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0200, 0x2000, 3, 1, 77, vtab_atmega2564rfr2}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega645", 132, F_AVR8, {0x1E, 0x96, 0x05}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 22, vtab_atmega645p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega645A", 133, F_AVR8, {0x1E, 0x96, 0x05}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 22, vtab_atmega645p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega645P", 134, F_AVR8, {0x1E, 0x96, 0x0D}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 22, vtab_atmega645p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega649", 135, F_AVR8, {0x1E, 0x96, 0x03}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 23, vtab_atmega649p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega649A", 136, F_AVR8, {0x1E, 0x96, 0x03}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 23, vtab_atmega649p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega649P", 137, F_AVR8, {0x1E, 0x96, 0x0B}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 23, vtab_atmega649p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega1280", 138, F_AVR8, {0x1E, 0x97, 0x03}, 0, 0x20000, 0x100, 4, 0x0400, 0, 0x1000, 8, 0x0200, 0x2000, 3, 1, 57, vtab_atmega2561}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega1281", 139, F_AVR8, {0x1E, 0x97, 0x04}, 0, 0x20000, 0x100, 4, 0x0400, 0, 0x1000, 8, 0x0200, 0x2000, 3, 1, 57, vtab_atmega2561}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega1284", 140, F_AVR8, {0x1E, 0x97, 0x06}, 0, 0x20000, 0x100, 4, 0x0400, 0, 0x1000, 8, 0x0100, 0x4000, 3, 1, 35, vtab_atmega1284p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega1284P", 141, F_AVR8, {0x1E, 0x97, 0x05}, 0, 0x20000, 0x100, 4, 0x0400, 0, 0x1000, 8, 0x0100, 0x4000, 3, 1, 35, vtab_atmega1284p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega1284RFR2", 142, F_AVR8, {0x1E, 0xA7, 0x03}, 0, 0x20000, 0x100, 4, 0x0400, 0, 0x1000, 8, 0x0200, 0x4000, 3, 1, 77, vtab_atmega2564rfr2}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega2560", 143, F_AVR8, {0x1E, 0x98, 0x01}, 0, 0x40000, 0x100, 4, 0x0400, 0, 0x1000, 8, 0x0200, 0x2000, 3, 1, 57, vtab_atmega2561}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega2561", 144, F_AVR8, {0x1E, 0x98, 0x02}, 0, 0x40000, 0x100, 4, 0x0400, 0, 0x1000, 8, 0x0200, 0x2000, 3, 1, 57, vtab_atmega2561}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega2564RFR2", 145, F_AVR8, {0x1E, 0xA8, 0x03}, 0, 0x40000, 0x100, 4, 0x0400, 0, 0x2000, 8, 0x0200, 0x8000, 3, 1, 77, vtab_atmega2564rfr2}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega3250", 146, F_AVR8, {0x1E, 0x95, 0x06}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 25, vtab_atmega6450p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega3250A", 147, F_AVR8, {0x1E, 0x95, 0x06}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 25, vtab_atmega6450p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega3250P", 148, F_AVR8, {0x1E, 0x95, 0x0E}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 25, vtab_atmega6450p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega3250PA", 149, F_AVR8, {0x1E, 0x95, 0x0E}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 25, vtab_atmega6450p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega3290", 150, F_AVR8, {0x1E, 0x95, 0x04}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 25, vtab_atmega6490p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega3290A", 151, F_AVR8, {0x1E, 0x95, 0x04}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 25, vtab_atmega6490p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega3290P", 152, F_AVR8, {0x1E, 0x95, 0x0C}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 25, vtab_atmega6490p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega3290PA", 153, F_AVR8, {0x1E, 0x95, 0x0C}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 25, vtab_atmega6490p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega6450", 154, F_AVR8, {0x1E, 0x96, 0x06}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 25, vtab_atmega6450p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega6450A", 155, F_AVR8, {0x1E, 0x96, 0x06}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 25, vtab_atmega6450p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega6450P", 156, F_AVR8, {0x1E, 0x96, 0x0E}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 25, vtab_atmega6450p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega6490", 157, F_AVR8, {0x1E, 0x96, 0x04}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 25, vtab_atmega6490p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega6490A", 158, F_AVR8, {0x1E, 0x96, 0x04}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 25, vtab_atmega6490p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega6490P", 159, F_AVR8, {0x1E, 0x96, 0x0C}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 25, vtab_atmega6490p}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega8515", 160, F_AVR8, {0x1E, 0x93, 0x06}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0200, 4, 0x0060, 0x0200, 2, 1, 17, vtab_atmega8515}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega8535", 161, F_AVR8, {0x1E, 0x93, 0x08}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0200, 4, 0x0060, 0x0200, 2, 1, 21, vtab_atmega8535}, // atdf, avr-gcc 12.2.0, avrdude + {"AT43USB320", 162, F_AVR8, {0xff, -1, -1}, 0, 0x10000, -1, -1, -1, -1, -1, -1, 0x0060, 0x0200, -1, -1, 0, NULL}, // avr-gcc 12.2.0 + {"AT43USB355", 163, F_AVR8, {0xff, -1, -1}, 0, 0x06000, -1, -1, -1, -1, -1, -1, 0x0060, 0x0400, -1, -1, 0, NULL}, // avr-gcc 12.2.0 + {"AT76C711", 164, F_AVR8, {0xff, -1, -1}, 0, 0x04000, -1, -1, -1, -1, -1, -1, 0x0060, 0x07a0, -1, -1, 0, NULL}, // avr-gcc 12.2.0 + {"AT86RF401", 165, F_AVR8, {0x1E, 0x91, 0x81}, 0, 0x00800, -1, -1, -1, -1, -1, -1, 0x0060, 0x0080, 0, 1, 3, vtab_at86rf401}, // avr-gcc 12.2.0 + {"AT90PWM1", 166, F_AVR8, {0x1E, 0x93, 0x83}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0200, 3, 1, 32, vtab_at90pwm316}, // atdf, avr-gcc 12.2.0 + {"AT90PWM2", 167, F_AVR8, {0x1E, 0x93, 0x81}, 0, 0x02000, 0x040, 4, -1, 0, 0x0200, 4, 0x0100, 0x0200, 3, 1, 32, vtab_at90pwm2}, // avr-gcc 12.2.0, avrdude + {"AT90PWM2B", 168, F_AVR8, {0x1E, 0x93, 0x83}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0200, 3, 1, 32, vtab_at90pwm3b}, // atdf, avr-gcc 12.2.0, avrdude + {"AT90PWM3", 169, F_AVR8, {0x1E, 0x93, 0x81}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0200, 3, 1, 32, vtab_at90pwm3b}, // atdf, avr-gcc 12.2.0, avrdude + {"AT90PWM3B", 170, F_AVR8, {0x1E, 0x93, 0x83}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0200, 3, 1, 32, vtab_at90pwm3b}, // atdf, avr-gcc 12.2.0, avrdude + {"AT90CAN32", 171, F_AVR8, {0x1E, 0x95, 0x81}, 0, 0x08000, 0x100, 4, 0x0400, 0, 0x0400, 8, 0x0100, 0x0800, 3, 1, 37, vtab_at90can128}, // atdf, avr-gcc 12.2.0, avrdude + {"AT90CAN64", 172, F_AVR8, {0x1E, 0x96, 0x81}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 37, vtab_at90can128}, // atdf, avr-gcc 12.2.0, avrdude + {"AT90PWM81", 173, F_AVR8, {0x1E, 0x93, 0x88}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0100, 3, 1, 20, vtab_at90pwm161}, // atdf, avr-gcc 12.2.0 + {"AT90USB82", 174, F_AVR8, {0x1E, 0x93, 0x82}, 0, 0x02000, 0x080, 4, 0x0200, 0, 0x0200, 4, 0x0100, 0x0200, 3, 1, 29, vtab_atmega32u2}, // atdf, avr-gcc 12.2.0, avrdude + {"AT90SCR100", 175, F_AVR8, {0x1E, 0x96, 0xC1}, 0, 0x10000, 0x100, 4, 0x0200, -1, -1, -1, 0x0100, 0x1000, 3, 1, 38, vtab_at90scr100}, // avr-gcc 12.2.0, boot size (manual) + {"AT90CAN128", 176, F_AVR8, {0x1E, 0x97, 0x81}, 0, 0x20000, 0x100, 4, 0x0400, 0, 0x1000, 8, 0x0100, 0x1000, 3, 1, 37, vtab_at90can128}, // atdf, avr-gcc 12.2.0, avrdude + {"AT90PWM161", 177, F_AVR8, {0x1E, 0x94, 0x8B}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 20, vtab_at90pwm161}, // atdf, avr-gcc 12.2.0 + {"AT90USB162", 178, F_AVR8, {0x1E, 0x94, 0x82}, 0, 0x04000, 0x080, 4, 0x0200, 0, 0x0200, 4, 0x0100, 0x0200, 3, 1, 29, vtab_atmega32u2}, // atdf, avr-gcc 12.2.0, avrdude + {"AT90PWM216", 179, F_AVR8, {0x1E, 0x94, 0x83}, 0, 0x04000, 0x080, 4, 0x0200, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 32, vtab_at90pwm316}, // atdf, avr-gcc 12.2.0, avrdude + {"AT90PWM316", 180, F_AVR8, {0x1E, 0x94, 0x83}, 0, 0x04000, 0x080, 4, 0x0200, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 32, vtab_at90pwm316}, // atdf, avr-gcc 12.2.0, avrdude + {"AT90USB646", 181, F_AVR8, {0x1E, 0x96, 0x82}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 38, vtab_atmega32u6}, // atdf, avr-gcc 12.2.0, avrdude + {"AT90USB647", 182, F_AVR8, {0x1E, 0x96, 0x82}, 0, 0x10000, 0x100, 4, 0x0400, 0, 0x0800, 8, 0x0100, 0x1000, 3, 1, 38, vtab_atmega32u6}, // atdf, avr-gcc 12.2.0, avrdude + {"AT90S1200", 183, F_AVR8, {0x1E, 0x90, 0x01}, 0, 0x00400, 0x001, -1, -1, 0, 0x0040, 1, 0x0060, 0x0020, 1, 1, 4, vtab_at90s1200}, // avr-gcc 12.2.0, avrdude + {"AT90USB1286", 184, F_AVR8, {0x1E, 0x97, 0x82}, 0, 0x20000, 0x100, 4, 0x0400, 0, 0x1000, 8, 0x0100, 0x2000, 3, 1, 38, vtab_atmega32u6}, // atdf, avr-gcc 12.2.0, avrdude + {"AT90USB1287", 185, F_AVR8, {0x1E, 0x97, 0x82}, 0, 0x20000, 0x100, 4, 0x0400, 0, 0x1000, 8, 0x0100, 0x2000, 3, 1, 38, vtab_atmega32u6}, // atdf, avr-gcc 12.2.0, avrdude + {"AT90S2313", 186, F_AVR8, {0x1E, 0x91, 0x01}, 0, 0x00800, 0x001, -1, -1, 0, 0x0080, 1, 0x0060, 0x0080, 1, 1, 11, vtab_at90s2313}, // avr-gcc 12.2.0, avrdude + {"AT90S2323", 187, F_AVR8, {0x1E, 0x91, 0x02}, 0, 0x00800, -1, -1, -1, -1, -1, -1, 0x0060, 0x0080, 1, 1, 3, vtab_attiny22}, // avr-gcc 12.2.0 + {"AT90S2333", 188, F_AVR8, {0x1E, 0x91, 0x05}, 0, 0x00800, 0x001, -1, -1, 0, 0x0080, 1, 0x0060, 0x0080, -1, -1, 14, vtab_at90s4433}, // avr-gcc 12.2.0, avrdude + {"AT90S2343", 189, F_AVR8, {0x1E, 0x91, 0x03}, 0, 0x00800, 0x001, -1, -1, 0, 0x0080, 1, 0x0060, 0x0080, 1, 1, 3, vtab_attiny22}, // avr-gcc 12.2.0, avrdude + {"AT90S4414", 190, F_AVR8, {0x1E, 0x92, 0x01}, 0, 0x01000, 0x001, -1, -1, 0, 0x0100, 1, 0x0060, 0x0100, 1, 1, 13, vtab_at90s8515}, // avr-gcc 12.2.0, avrdude + {"AT90S4433", 191, F_AVR8, {0x1E, 0x92, 0x03}, 0, 0x01000, 0x001, -1, -1, 0, 0x0100, 1, 0x0060, 0x0080, 1, 1, 14, vtab_at90s4433}, // avr-gcc 12.2.0, avrdude + {"AT90S4434", 192, F_AVR8, {0x1E, 0x92, 0x02}, 0, 0x01000, 0x001, -1, -1, 0, 0x0100, 1, 0x0060, 0x0100, 1, 1, 17, vtab_at90s8535}, // avr-gcc 12.2.0, avrdude + {"AT90S8515", 193, F_AVR8, {0x1E, 0x93, 0x01}, 0, 0x02000, 0x001, -1, -1, 0, 0x0200, 1, 0x0060, 0x0200, 1, 1, 13, vtab_at90s8515}, // avr-gcc 12.2.0, avrdude + {"AT90C8534", 194, F_AVR8, {0xff, -1, -1}, 0, 0x02000, -1, -1, -1, -1, -1, -1, 0x0060, 0x0100, -1, -1, 0, NULL}, // avr-gcc 12.2.0 + {"AT90S8535", 195, F_AVR8, {0x1E, 0x93, 0x03}, 0, 0x02000, 0x001, -1, -1, 0, 0x0200, 1, 0x0060, 0x0200, 1, 1, 17, vtab_at90s8535}, // avr-gcc 12.2.0, avrdude + {"AT94K", 196, F_AVR8, {0xff, -1, -1}, 0, 0x08000, -1, -1, -1, -1, -1, -1, 0x0060, 0x0fa0, -1, -1, 0, NULL}, // avr-gcc 12.2.0 + {"ATA5272", 197, F_AVR8, {0x1E, 0x93, 0x87}, 0, 0x02000, 0x080, 0, 0, 0, 0x0200, 4, 0x0100, 0x0200, 3, 1, 37, vtab_ata5272}, // atdf, avr-gcc 12.2.0 + {"ATA5505", 198, F_AVR8, {0x1E, 0x94, 0x87}, 0, 0x04000, 0x080, 0, 0, 0, 0x0200, 4, 0x0100, 0x0200, 3, 1, 20, vtab_attiny167}, // atdf, avr-gcc 12.2.0 + {"ATA5700M322", 199, F_AVR8, {0x1E, 0x95, 0x67}, 0x08000, 0x08000, 0x040, 0, 0, 0, 0x0880, 16, 0x0200, 0x0400, 1, 1, 51, vtab_ata5702m322}, // atdf + {"ATA5702M322", 200, F_AVR8, {0x1E, 0x95, 0x69}, 0x08000, 0x08000, 0x040, 0, 0, 0, 0x0880, 16, 0x0200, 0x0400, 1, 1, 51, vtab_ata5702m322}, // atdf, avr-gcc 12.2.0 + {"ATA5781", 201, F_AVR8, {0x1E, 0x95, 0x64}, -1, -1, -1, 0, 0, 0, 0x0400, 16, 0x0200, 0x0400, 1, 1, 42, vtab_ata8515}, // atdf + {"ATA5782", 202, F_AVR8, {0x1E, 0x95, 0x65}, 0x08000, 0x05000, 0x040, 1, 0x5000, 0, 0x0400, 16, 0x0200, 0x0400, 1, 1, 42, vtab_ata8515}, // atdf, avr-gcc 12.2.0 + {"ATA5783", 203, F_AVR8, {0x1E, 0x95, 0x66}, -1, -1, -1, 0, 0, 0, 0x0400, 16, 0x0200, 0x0400, 1, 1, 42, vtab_ata8515}, // atdf + {"ATA5787", 204, F_AVR8, {0x1E, 0x94, 0x6C}, 0x08000, 0x05200, 0x040, 0, 0, 0, 0x0400, 16, 0x0200, 0x0800, 1, 1, 44, vtab_ata5835}, // atdf + {"ATA5790", 205, F_AVR8, {0x1E, 0x94, 0x61}, 0, 0x04000, 0x080, 1, 0x0800, 0, 0x0800, 16, 0x0100, 0x0200, 1, 1, 30, vtab_ata5790}, // atdf, avr-gcc 12.2.0 + {"ATA5790N", 206, F_AVR8, {0x1E, 0x94, 0x62}, 0, 0x04000, 0x080, 1, 0x0800, 0, 0x0800, 16, 0x0100, 0x0200, 1, 1, 31, vtab_ata5791}, // atdf, avr-gcc 12.2.0 + {"ATA5791", 207, F_AVR8, {0x1E, 0x94, 0x62}, 0, 0x04000, 0x080, 1, 0x0800, 0, 0x0800, 16, 0x0100, 0x0200, 1, 1, 31, vtab_ata5791}, // atdf, avr-gcc 7.3.0 + {"ATA5795", 208, F_AVR8, {0x1E, 0x93, 0x61}, 0, 0x02000, 0x040, 1, 0x0800, 0, 0x0800, 16, 0x0100, 0x0200, 1, 1, 23, vtab_ata5795}, // atdf, avr-gcc 12.2.0 + {"ATA5831", 209, F_AVR8, {0x1E, 0x95, 0x61}, 0x08000, 0x05000, 0x040, 1, 0x5000, 0, 0x0400, 16, 0x0200, 0x0400, 1, 1, 42, vtab_ata8515}, // atdf, avr-gcc 12.2.0 + {"ATA5832", 210, F_AVR8, {0x1E, 0x95, 0x62}, -1, -1, -1, 0, 0, 0, 0x0400, 16, 0x0200, 0x0400, 1, 1, 42, vtab_ata8515}, // atdf + {"ATA5833", 211, F_AVR8, {0x1E, 0x95, 0x63}, -1, -1, -1, 0, 0, 0, 0x0400, 16, 0x0200, 0x0400, 1, 1, 42, vtab_ata8515}, // atdf + {"ATA5835", 212, F_AVR8, {0x1E, 0x94, 0x6B}, 0x08000, 0x05200, 0x040, 0, 0, 0, 0x0400, 16, 0x0200, 0x0800, 1, 1, 44, vtab_ata5835}, // atdf + {"ATA6285", 213, F_AVR8, {0x1E, 0x93, 0x82}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0140, 4, 0x0100, 0x0200, 2, 1, 27, vtab_ata6289}, // atdf, avr-gcc 12.2.0 + {"ATA6286", 214, F_AVR8, {0x1E, 0x93, 0x82}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0140, 4, 0x0100, 0x0200, 2, 1, 27, vtab_ata6289}, // atdf, avr-gcc 12.2.0 + {"ATA6289", 215, F_AVR8, {0x1E, 0x93, 0x82}, 0, 0x02000, 0x040, 4, 0x0100, -1, -1, -1, 0x0100, 0x0200, 2, 1, 27, vtab_ata6289}, // avr-gcc 12.2.0, boot size (manual) + {"ATA6612C", 216, F_AVR8, {0x1E, 0x93, 0x0A}, 0, 0x02000, 0x040, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 26, vtab_atmega328p}, // atdf, avr-gcc 12.2.0 + {"ATA6613C", 217, F_AVR8, {0x1E, 0x94, 0x06}, 0, 0x04000, 0x080, 4, 0x0100, 0, 0x0200, 4, 0x0100, 0x0400, 3, 1, 26, vtab_atmega328p}, // atdf, avr-gcc 12.2.0 + {"ATA6614Q", 218, F_AVR8, {0x1E, 0x95, 0x0F}, 0, 0x08000, 0x080, 4, 0x0200, 0, 0x0400, 4, 0x0100, 0x0800, 3, 1, 26, vtab_atmega328p}, // atdf, avr-gcc 12.2.0 + {"ATA6616C", 219, F_AVR8, {0x1E, 0x93, 0x87}, 0, 0x02000, 0x080, 0, 0, 0, 0x0200, 4, 0x0100, 0x0200, 3, 1, 20, vtab_attiny167}, // atdf, avr-gcc 12.2.0 + {"ATA6617C", 220, F_AVR8, {0x1E, 0x94, 0x87}, 0, 0x04000, 0x080, 0, 0, 0, 0x0200, 4, 0x0100, 0x0200, 3, 1, 20, vtab_attiny167}, // atdf, avr-gcc 12.2.0 + {"ATA8210", 221, F_AVR8, {0x1E, 0x95, 0x65}, 0x08000, 0x05000, 0x040, 1, 0x5000, 0, 0x0400, 16, 0x0200, 0x0400, 1, 1, 42, vtab_ata8515}, // atdf, avr-gcc 7.3.0 + {"ATA8215", 222, F_AVR8, {0x1E, 0x95, 0x64}, -1, -1, -1, 0, 0, 0, 0x0400, 16, 0x0200, 0x0400, 1, 1, 42, vtab_ata8515}, // atdf + {"ATA8510", 223, F_AVR8, {0x1E, 0x95, 0x61}, 0x08000, 0x05000, 0x040, 1, 0x5000, 0, 0x0400, 16, 0x0200, 0x0400, 1, 1, 42, vtab_ata8515}, // atdf, avr-gcc 7.3.0 + {"ATA8515", 224, F_AVR8, {0x1E, 0x95, 0x63}, -1, -1, -1, 0, 0, 0, 0x0400, 16, 0x0200, 0x0400, 1, 1, 42, vtab_ata8515}, // atdf + {"ATA664251", 225, F_AVR8, {0x1E, 0x94, 0x87}, 0, 0x04000, 0x080, 0, 0, 0, 0x0200, 4, 0x0100, 0x0200, 3, 1, 20, vtab_attiny167}, // atdf, avr-gcc 12.2.0 + {"M3000", 226, F_AVR8, {0xff, -1, -1}, 0, 0x10000, -1, -1, -1, -1, -1, -1, 0x1000, 0x1000, -1, -1, 0, NULL}, // avr-gcc 12.2.0 + {"LGT8F88P", 227, F_AVR8, {0x1E, 0x93, 0x0F}, 0, 0x02000, 0x040, -1, -1, 0, 0x0200, 4, -1, -1, -1, -1, 0, NULL}, // avrdude + {"LGT8F168P", 228, F_AVR8, {0x1E, 0x94, 0x0B}, 0, 0x04000, 0x080, -1, -1, 0, 0x0200, 4, -1, -1, -1, -1, 0, NULL}, // avrdude + {"LGT8F328P", 229, F_AVR8, {0x1E, 0x95, 0x0F}, 0, 0x08000, 0x080, -1, -1, 0, 0x0400, 4, -1, -1, -1, -1, 0, NULL}, // avrdude + + {"ATxmega8E5", 230, F_XMEGA, {0x1E, 0x93, 0x41}, 0, 0x02800, 0x080, 1, 0x0800, 0, 0x0200, 32, 0x2000, 0x0400, 7, 1, 43, vtab_atxmega32e5}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega16A4", 231, F_XMEGA, {0x1E, 0x94, 0x41}, 0, 0x05000, 0x100, 1, 0x1000, 0, 0x0400, 32, 0x2000, 0x0800, 6, 1, 94, vtab_atxmega32a4}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega16A4U", 232, F_XMEGA, {0x1E, 0x94, 0x41}, 0, 0x05000, 0x100, 1, 0x1000, 0, 0x0400, 32, 0x2000, 0x0800, 6, 1, 127, vtab_atxmega128a4u}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega16C4", 233, F_XMEGA, {0x1E, 0x94, 0x43}, 0, 0x05000, 0x100, 1, 0x1000, 0, 0x0400, 32, 0x2000, 0x0800, 6, 1, 127, vtab_atxmega32c4}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega16D4", 234, F_XMEGA, {0x1E, 0x94, 0x42}, 0, 0x05000, 0x100, 1, 0x1000, 0, 0x0400, 32, 0x2000, 0x0800, 6, 1, 91, vtab_atxmega32d4}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega16E5", 235, F_XMEGA, {0x1E, 0x94, 0x45}, 0, 0x05000, 0x080, 1, 0x1000, 0, 0x0200, 32, 0x2000, 0x0800, 7, 1, 43, vtab_atxmega32e5}, // atdf, avr-gcc 7.3.0, avrdude + {"ATxmega32C3", 236, F_XMEGA, {0x1E, 0x95, 0x49}, 0, 0x09000, 0x100, 1, 0x1000, 0, 0x0400, 32, 0x2000, 0x1000, 6, 1, 127, vtab_atxmega256c3}, // atdf, avr-gcc 12.2.0 + {"ATxmega32D3", 237, F_XMEGA, {0x1E, 0x95, 0x4A}, 0, 0x09000, 0x100, 1, 0x1000, 0, 0x0400, 32, 0x2000, 0x1000, 6, 1, 114, vtab_atxmega384d3}, // atdf, avr-gcc 12.2.0 + {"ATxmega32A4", 238, F_XMEGA, {0x1E, 0x95, 0x41}, 0, 0x09000, 0x100, 1, 0x1000, 0, 0x0400, 32, 0x2000, 0x1000, 6, 1, 94, vtab_atxmega32a4}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega32A4U", 239, F_XMEGA, {0x1E, 0x95, 0x41}, 0, 0x09000, 0x100, 1, 0x1000, 0, 0x0400, 32, 0x2000, 0x1000, 6, 1, 127, vtab_atxmega128a4u}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega32C4", 240, F_XMEGA, {0x1E, 0x95, 0x44}, 0, 0x09000, 0x100, 1, 0x1000, 0, 0x0400, 32, 0x2000, 0x1000, 6, 1, 127, vtab_atxmega32c4}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega32D4", 241, F_XMEGA, {0x1E, 0x95, 0x42}, 0, 0x09000, 0x100, 1, 0x1000, 0, 0x0400, 32, 0x2000, 0x1000, 6, 1, 91, vtab_atxmega32d4}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega32E5", 242, F_XMEGA, {0x1E, 0x95, 0x4C}, 0, 0x09000, 0x080, 1, 0x1000, 0, 0x0400, 32, 0x2000, 0x1000, 7, 1, 43, vtab_atxmega32e5}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega64A1", 243, F_XMEGA, {0x1E, 0x96, 0x4E}, 0, 0x11000, 0x100, 1, 0x1000, 0, 0x0800, 32, 0x2000, 0x1000, 6, 1, 125, vtab_atxmega128a1}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega64A1U", 244, F_XMEGA, {0x1E, 0x96, 0x4E}, 0, 0x11000, 0x100, 1, 0x1000, 0, 0x0800, 32, 0x2000, 0x1000, 6, 1, 127, vtab_atxmega128a1u}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega64B1", 245, F_XMEGA, {0x1E, 0x96, 0x52}, 0, 0x11000, 0x100, 1, 0x1000, 0, 0x0800, 32, 0x2000, 0x1000, 6, 1, 81, vtab_atxmega128b1}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega64A3", 246, F_XMEGA, {0x1E, 0x96, 0x42}, 0, 0x11000, 0x100, 1, 0x1000, 0, 0x0800, 32, 0x2000, 0x1000, 6, 1, 122, vtab_atxmega256a3}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega64A3U", 247, F_XMEGA, {0x1E, 0x96, 0x42}, 0, 0x11000, 0x100, 1, 0x1000, 0, 0x0800, 32, 0x2000, 0x1000, 6, 1, 127, vtab_atxmega256a3u}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega64B3", 248, F_XMEGA, {0x1E, 0x96, 0x51}, 0, 0x11000, 0x100, 1, 0x1000, 0, 0x0800, 32, 0x2000, 0x1000, 6, 1, 54, vtab_atxmega128b3}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega64C3", 249, F_XMEGA, {0x1E, 0x96, 0x49}, 0, 0x11000, 0x100, 1, 0x1000, 0, 0x0800, 32, 0x2000, 0x1000, 6, 1, 127, vtab_atxmega256c3}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega64D3", 250, F_XMEGA, {0x1E, 0x96, 0x4A}, 0, 0x11000, 0x100, 1, 0x1000, 0, 0x0800, 32, 0x2000, 0x1000, 6, 1, 114, vtab_atxmega384d3}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega64A4", 251, F_XMEGA, {0x1E, 0x96, 0x46}, 0, 0x11000, 0x100, -1, -1, 0, 0x0800, 32, -1, -1, -1, -1, 0, NULL}, // avrdude + {"ATxmega64A4U", 252, F_XMEGA, {0x1E, 0x96, 0x46}, 0, 0x11000, 0x100, 1, 0x1000, 0, 0x0800, 32, 0x2000, 0x1000, 6, 1, 127, vtab_atxmega128a4u}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega64D4", 253, F_XMEGA, {0x1E, 0x96, 0x47}, 0, 0x11000, 0x100, 1, 0x1000, 0, 0x0800, 32, 0x2000, 0x1000, 6, 1, 91, vtab_atxmega128d4}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega128A1", 254, F_XMEGA, {0x1E, 0x97, 0x4C}, 0, 0x22000, 0x200, 1, 0x2000, 0, 0x0800, 32, 0x2000, 0x2000, 6, 1, 125, vtab_atxmega128a1}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega128A1revD", 255, F_XMEGA, {0x1E, 0x97, 0x41}, 0, 0x22000, 0x200, -1, -1, 0, 0x0800, 32, -1, -1, -1, -1, 0, NULL}, // avrdude + {"ATxmega128A1U", 256, F_XMEGA, {0x1E, 0x97, 0x4C}, 0, 0x22000, 0x200, 1, 0x2000, 0, 0x0800, 32, 0x2000, 0x2000, 6, 1, 127, vtab_atxmega128a1u}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega128B1", 257, F_XMEGA, {0x1E, 0x97, 0x4D}, 0, 0x22000, 0x100, 1, 0x2000, 0, 0x0800, 32, 0x2000, 0x2000, 6, 1, 81, vtab_atxmega128b1}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega128A3", 258, F_XMEGA, {0x1E, 0x97, 0x42}, 0, 0x22000, 0x200, 1, 0x2000, 0, 0x0800, 32, 0x2000, 0x2000, 6, 1, 122, vtab_atxmega256a3}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega128A3U", 259, F_XMEGA, {0x1E, 0x97, 0x42}, 0, 0x22000, 0x200, 1, 0x2000, 0, 0x0800, 32, 0x2000, 0x2000, 6, 1, 127, vtab_atxmega256a3u}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega128B3", 260, F_XMEGA, {0x1E, 0x97, 0x4B}, 0, 0x22000, 0x100, 1, 0x2000, 0, 0x0800, 32, 0x2000, 0x2000, 6, 1, 54, vtab_atxmega128b3}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega128C3", 261, F_XMEGA, {0x1E, 0x97, 0x52}, 0, 0x22000, 0x200, 1, 0x2000, 0, 0x0800, 32, 0x2000, 0x2000, 6, 1, 127, vtab_atxmega256c3}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega128D3", 262, F_XMEGA, {0x1E, 0x97, 0x48}, 0, 0x22000, 0x200, 1, 0x2000, 0, 0x0800, 32, 0x2000, 0x2000, 6, 1, 114, vtab_atxmega384d3}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega128A4", 263, F_XMEGA, {0x1E, 0x97, 0x46}, 0, 0x22000, 0x200, -1, -1, 0, 0x0800, 32, -1, -1, -1, -1, 0, NULL}, // avrdude + {"ATxmega128A4U", 264, F_XMEGA, {0x1E, 0x97, 0x46}, 0, 0x22000, 0x100, 1, 0x2000, 0, 0x0800, 32, 0x2000, 0x2000, 6, 1, 127, vtab_atxmega128a4u}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega128D4", 265, F_XMEGA, {0x1E, 0x97, 0x47}, 0, 0x22000, 0x100, 1, 0x2000, 0, 0x0800, 32, 0x2000, 0x2000, 6, 1, 91, vtab_atxmega128d4}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega192A1", 266, F_XMEGA, {0x1E, 0x97, 0x4E}, 0, 0x32000, 0x200, -1, -1, 0, 0x0800, 32, -1, -1, -1, -1, 0, NULL}, // avrdude + {"ATxmega192A3", 267, F_XMEGA, {0x1E, 0x97, 0x44}, 0, 0x32000, 0x200, 1, 0x2000, 0, 0x0800, 32, 0x2000, 0x4000, 6, 1, 122, vtab_atxmega256a3}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega192A3U", 268, F_XMEGA, {0x1E, 0x97, 0x44}, 0, 0x32000, 0x200, 1, 0x2000, 0, 0x0800, 32, 0x2000, 0x4000, 6, 1, 127, vtab_atxmega256a3u}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega192C3", 269, F_XMEGA, {0x1E, 0x97, 0x51}, 0, 0x32000, 0x200, 1, 0x2000, 0, 0x0800, 32, 0x2000, 0x4000, 6, 1, 127, vtab_atxmega256c3}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega192D3", 270, F_XMEGA, {0x1E, 0x97, 0x49}, 0, 0x32000, 0x200, 1, 0x2000, 0, 0x0800, 32, 0x2000, 0x4000, 6, 1, 114, vtab_atxmega384d3}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega256A1", 271, F_XMEGA, {0x1E, 0x98, 0x46}, 0, 0x42000, 0x200, -1, -1, 0, 0x1000, 32, -1, -1, -1, -1, 0, NULL}, // avrdude + {"ATxmega256A3", 272, F_XMEGA, {0x1E, 0x98, 0x42}, 0, 0x42000, 0x200, 1, 0x2000, 0, 0x1000, 32, 0x2000, 0x4000, 6, 1, 122, vtab_atxmega256a3}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega256A3B", 273, F_XMEGA, {0x1E, 0x98, 0x43}, 0, 0x42000, 0x200, 1, 0x2000, 0, 0x1000, 32, 0x2000, 0x4000, 6, 1, 122, vtab_atxmega256a3b}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega256A3BU", 274, F_XMEGA, {0x1E, 0x98, 0x43}, 0, 0x42000, 0x200, 1, 0x2000, 0, 0x1000, 32, 0x2000, 0x4000, 6, 1, 127, vtab_atxmega256a3bu}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega256A3U", 275, F_XMEGA, {0x1E, 0x98, 0x42}, 0, 0x42000, 0x200, 1, 0x2000, 0, 0x1000, 32, 0x2000, 0x4000, 6, 1, 127, vtab_atxmega256a3u}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega256C3", 276, F_XMEGA, {0x1E, 0x98, 0x46}, 0, 0x42000, 0x200, 1, 0x2000, 0, 0x1000, 32, 0x2000, 0x4000, 6, 1, 127, vtab_atxmega256c3}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega256D3", 277, F_XMEGA, {0x1E, 0x98, 0x44}, 0, 0x42000, 0x200, 1, 0x2000, 0, 0x1000, 32, 0x2000, 0x4000, 6, 1, 114, vtab_atxmega384d3}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega384C3", 278, F_XMEGA, {0x1E, 0x98, 0x45}, 0, 0x62000, 0x200, 1, 0x2000, 0, 0x1000, 32, 0x2000, 0x8000, 6, 1, 127, vtab_atxmega384c3}, // atdf, avr-gcc 12.2.0, avrdude + {"ATxmega384D3", 279, F_XMEGA, {0x1E, 0x98, 0x47}, 0, 0x62000, 0x200, 1, 0x2000, 0, 0x1000, 32, 0x2000, 0x8000, 6, 1, 114, vtab_atxmega384d3}, // atdf, avr-gcc 12.2.0, avrdude + + {"ATtiny202", 280, F_AVR8X, {0x1E, 0x91, 0x23}, 0, 0x00800, 0x040, 1, 0, 0x01400, 0x0040, 32, 0x3f80, 0x0080, 10, 1, 26, vtab_attiny402}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny204", 281, F_AVR8X, {0x1E, 0x91, 0x22}, 0, 0x00800, 0x040, 1, 0, 0x01400, 0x0040, 32, 0x3f80, 0x0080, 10, 1, 26, vtab_attiny404}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny212", 282, F_AVR8X, {0x1E, 0x91, 0x21}, 0, 0x00800, 0x040, 1, 0, 0x01400, 0x0040, 32, 0x3f80, 0x0080, 10, 1, 26, vtab_attiny412}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny214", 283, F_AVR8X, {0x1E, 0x91, 0x20}, 0, 0x00800, 0x040, 1, 0, 0x01400, 0x0040, 32, 0x3f80, 0x0080, 10, 1, 26, vtab_attiny814}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny402", 284, F_AVR8X, {0x1E, 0x92, 0x27}, 0, 0x01000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3f00, 0x0100, 10, 1, 26, vtab_attiny402}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny404", 285, F_AVR8X, {0x1E, 0x92, 0x26}, 0, 0x01000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3f00, 0x0100, 10, 1, 26, vtab_attiny404}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny406", 286, F_AVR8X, {0x1E, 0x92, 0x25}, 0, 0x01000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3f00, 0x0100, 10, 1, 26, vtab_attiny406}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny412", 287, F_AVR8X, {0x1E, 0x92, 0x23}, 0, 0x01000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3f00, 0x0100, 10, 1, 26, vtab_attiny412}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny414", 288, F_AVR8X, {0x1E, 0x92, 0x22}, 0, 0x01000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3f00, 0x0100, 10, 1, 26, vtab_attiny814}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny416", 289, F_AVR8X, {0x1E, 0x92, 0x21}, 0, 0x01000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3f00, 0x0100, 10, 1, 26, vtab_attiny817}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny416auto", 290, F_AVR8X, {0x1E, 0x92, 0x28}, 0, 0x01000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3f00, 0x0100, 10, 1, 26, vtab_attiny817}, // atdf + {"ATtiny417", 291, F_AVR8X, {0x1E, 0x92, 0x20}, 0, 0x01000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3f00, 0x0100, 10, 1, 26, vtab_attiny817}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny424", 292, F_AVR8X, {0x1E, 0x92, 0x2C}, 0, 0x01000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3e00, 0x0200, 10, 1, 30, vtab_attiny3227}, // atdf, avrdude + {"ATtiny426", 293, F_AVR8X, {0x1E, 0x92, 0x2B}, 0, 0x01000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3e00, 0x0200, 10, 1, 30, vtab_attiny3227}, // atdf, avrdude + {"ATtiny427", 294, F_AVR8X, {0x1E, 0x92, 0x2A}, 0, 0x01000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3e00, 0x0200, 10, 1, 30, vtab_attiny3227}, // atdf, avrdude + {"ATtiny804", 295, F_AVR8X, {0x1E, 0x93, 0x25}, 0, 0x02000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3e00, 0x0200, 10, 1, 31, vtab_attiny1607}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny806", 296, F_AVR8X, {0x1E, 0x93, 0x24}, 0, 0x02000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3e00, 0x0200, 10, 1, 31, vtab_attiny1607}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny807", 297, F_AVR8X, {0x1E, 0x93, 0x23}, 0, 0x02000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3e00, 0x0200, 10, 1, 31, vtab_attiny1607}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny814", 298, F_AVR8X, {0x1E, 0x93, 0x22}, 0, 0x02000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3e00, 0x0200, 10, 1, 26, vtab_attiny814}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny816", 299, F_AVR8X, {0x1E, 0x93, 0x21}, 0, 0x02000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3e00, 0x0200, 10, 1, 26, vtab_attiny817}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny817", 300, F_AVR8X, {0x1E, 0x93, 0x20}, 0, 0x02000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3e00, 0x0200, 10, 1, 26, vtab_attiny817}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny824", 301, F_AVR8X, {0x1E, 0x93, 0x29}, 0, 0x02000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3c00, 0x0400, 10, 1, 30, vtab_attiny3227}, // atdf, avrdude + {"ATtiny826", 302, F_AVR8X, {0x1E, 0x93, 0x28}, 0, 0x02000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3c00, 0x0400, 10, 1, 30, vtab_attiny3227}, // atdf, avrdude + {"ATtiny827", 303, F_AVR8X, {0x1E, 0x93, 0x27}, 0, 0x02000, 0x040, 1, 0, 0x01400, 0x0080, 32, 0x3c00, 0x0400, 10, 1, 30, vtab_attiny3227}, // atdf, avrdude + {"ATtiny1604", 304, F_AVR8X, {0x1E, 0x94, 0x25}, 0, 0x04000, 0x040, 1, 0, 0x01400, 0x0100, 32, 0x3c00, 0x0400, 10, 1, 31, vtab_attiny1607}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny1606", 305, F_AVR8X, {0x1E, 0x94, 0x24}, 0, 0x04000, 0x040, 1, 0, 0x01400, 0x0100, 32, 0x3c00, 0x0400, 10, 1, 31, vtab_attiny1607}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny1607", 306, F_AVR8X, {0x1E, 0x94, 0x23}, 0, 0x04000, 0x040, 1, 0, 0x01400, 0x0100, 32, 0x3c00, 0x0400, 10, 1, 31, vtab_attiny1607}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny1614", 307, F_AVR8X, {0x1E, 0x94, 0x22}, 0, 0x04000, 0x040, 1, 0, 0x01400, 0x0100, 32, 0x3800, 0x0800, 10, 1, 31, vtab_attiny1614}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny1616", 308, F_AVR8X, {0x1E, 0x94, 0x21}, 0, 0x04000, 0x040, 1, 0, 0x01400, 0x0100, 32, 0x3800, 0x0800, 10, 1, 31, vtab_attiny3217}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny1617", 309, F_AVR8X, {0x1E, 0x94, 0x20}, 0, 0x04000, 0x040, 1, 0, 0x01400, 0x0100, 32, 0x3800, 0x0800, 10, 1, 31, vtab_attiny3217}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny1624", 310, F_AVR8X, {0x1E, 0x94, 0x2A}, 0, 0x04000, 0x040, 1, 0, 0x01400, 0x0100, 32, 0x3800, 0x0800, 10, 1, 30, vtab_attiny3227}, // atdf, avrdude + {"ATtiny1626", 311, F_AVR8X, {0x1E, 0x94, 0x29}, 0, 0x04000, 0x040, 1, 0, 0x01400, 0x0100, 32, 0x3800, 0x0800, 10, 1, 30, vtab_attiny3227}, // atdf, avrdude + {"ATtiny1627", 312, F_AVR8X, {0x1E, 0x94, 0x28}, 0, 0x04000, 0x040, 1, 0, 0x01400, 0x0100, 32, 0x3800, 0x0800, 10, 1, 30, vtab_attiny3227}, // atdf, avrdude + {"ATtiny3214", 313, F_AVR8X, {0x1E, 0x95, 0x20}, 0, 0x08000, 0x080, 1, 0, 0x01400, 0x0100, 64, 0x3800, 0x0800, 10, 1, 31, vtab_attiny3214}, // avr-gcc 12.2.0 + {"ATtiny3216", 314, F_AVR8X, {0x1E, 0x95, 0x21}, 0, 0x08000, 0x080, 1, 0, 0x01400, 0x0100, 64, 0x3800, 0x0800, 10, 1, 31, vtab_attiny3217}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny3217", 315, F_AVR8X, {0x1E, 0x95, 0x22}, 0, 0x08000, 0x080, 1, 0, 0x01400, 0x0100, 64, 0x3800, 0x0800, 10, 1, 31, vtab_attiny3217}, // atdf, avr-gcc 12.2.0, avrdude + {"ATtiny3224", 316, F_AVR8X, {0x1E, 0x95, 0x28}, 0, 0x08000, 0x080, 1, 0, 0x01400, 0x0100, 64, 0x3400, 0x0c00, 10, 1, 30, vtab_attiny3227}, // atdf, avrdude + {"ATtiny3226", 317, F_AVR8X, {0x1E, 0x95, 0x27}, 0, 0x08000, 0x080, 1, 0, 0x01400, 0x0100, 64, 0x3400, 0x0c00, 10, 1, 30, vtab_attiny3227}, // atdf, avrdude + {"ATtiny3227", 318, F_AVR8X, {0x1E, 0x95, 0x26}, 0, 0x08000, 0x080, 1, 0, 0x01400, 0x0100, 64, 0x3400, 0x0c00, 10, 1, 30, vtab_attiny3227}, // atdf, avrdude + {"ATmega808", 319, F_AVR8X, {0x1E, 0x93, 0x26}, 0, 0x02000, 0x040, 1, 0, 0x01400, 0x0100, 32, 0x3c00, 0x0400, 10, 1, 36, vtab_atmega4808}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega809", 320, F_AVR8X, {0x1E, 0x93, 0x2A}, 0, 0x02000, 0x040, 1, 0, 0x01400, 0x0100, 32, 0x3c00, 0x0400, 10, 1, 40, vtab_atmega4809}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega1608", 321, F_AVR8X, {0x1E, 0x94, 0x27}, 0, 0x04000, 0x040, 1, 0, 0x01400, 0x0100, 32, 0x3800, 0x0800, 10, 1, 36, vtab_atmega4808}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega1609", 322, F_AVR8X, {0x1E, 0x94, 0x26}, 0, 0x04000, 0x040, 1, 0, 0x01400, 0x0100, 32, 0x3800, 0x0800, 10, 1, 40, vtab_atmega4809}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega3208", 323, F_AVR8X, {0x1E, 0x95, 0x30}, 0, 0x08000, 0x080, 1, 0, 0x01400, 0x0100, 64, 0x3000, 0x1000, 10, 1, 36, vtab_atmega4808}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega3209", 324, F_AVR8X, {0x1E, 0x95, 0x31}, 0, 0x08000, 0x080, 1, 0, 0x01400, 0x0100, 64, 0x3000, 0x1000, 10, 1, 40, vtab_atmega4809}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega4808", 325, F_AVR8X, {0x1E, 0x96, 0x50}, 0, 0x0c000, 0x080, 1, 0, 0x01400, 0x0100, 64, 0x2800, 0x1800, 10, 1, 36, vtab_atmega4808}, // atdf, avr-gcc 12.2.0, avrdude + {"ATmega4809", 326, F_AVR8X, {0x1E, 0x96, 0x51}, 0, 0x0c000, 0x080, 1, 0, 0x01400, 0x0100, 64, 0x2800, 0x1800, 10, 1, 40, vtab_atmega4809}, // atdf, avr-gcc 12.2.0, avrdude + {"AVR8EA28", 327, F_AVR8X, {0x1E, 0x93, 0x2C}, 0, 0x02000, 0x040, 1, 0, 0x01400, 0x0200, 8, -1, -1, -1, -1, 0, NULL}, // avrdude + {"AVR8EA32", 328, F_AVR8X, {0x1E, 0x93, 0x2B}, 0, 0x02000, 0x040, 1, 0, 0x01400, 0x0200, 8, -1, -1, -1, -1, 0, NULL}, // avrdude + {"AVR16DD14", 329, F_AVR8X, {0x1E, 0x94, 0x34}, 0, 0x04000, 0x200, 1, 0, 0x01400, 0x0100, 1, 0x7800, 0x0800, 16, 4, 36, vtab_avr64dd32}, // atdf, avrdude + {"AVR16DD20", 330, F_AVR8X, {0x1E, 0x94, 0x33}, 0, 0x04000, 0x200, 1, 0, 0x01400, 0x0100, 1, 0x7800, 0x0800, 16, 4, 36, vtab_avr64dd32}, // atdf, avrdude + {"AVR16DD28", 331, F_AVR8X, {0x1E, 0x94, 0x32}, 0, 0x04000, 0x200, 1, 0, 0x01400, 0x0100, 1, 0x7800, 0x0800, 16, 4, 36, vtab_avr64dd32}, // atdf, avrdude + {"AVR16EA28", 332, F_AVR8X, {0x1E, 0x94, 0x37}, 0, 0x04000, 0x040, 1, 0, 0x01400, 0x0200, 8, -1, -1, -1, -1, 0, NULL}, // avrdude + {"AVR16DD32", 333, F_AVR8X, {0x1E, 0x94, 0x31}, 0, 0x04000, 0x200, 1, 0, 0x01400, 0x0100, 1, 0x7800, 0x0800, 16, 4, 36, vtab_avr64dd32}, // atdf, avrdude + {"AVR16EA32", 334, F_AVR8X, {0x1E, 0x94, 0x36}, 0, 0x04000, 0x040, 1, 0, 0x01400, 0x0200, 8, -1, -1, -1, -1, 0, NULL}, // avrdude + {"AVR16EA48", 335, F_AVR8X, {0x1E, 0x94, 0x35}, 0, 0x04000, 0x040, 1, 0, 0x01400, 0x0200, 8, -1, -1, -1, -1, 0, NULL}, // avrdude + {"AVR32DD14", 336, F_AVR8X, {0x1E, 0x95, 0x3B}, 0, 0x08000, 0x200, 1, 0, 0x01400, 0x0100, 1, 0x7000, 0x1000, 16, 4, 36, vtab_avr64dd32}, // atdf, avrdude + {"AVR32DD20", 337, F_AVR8X, {0x1E, 0x95, 0x3A}, 0, 0x08000, 0x200, 1, 0, 0x01400, 0x0100, 1, 0x7000, 0x1000, 16, 4, 36, vtab_avr64dd32}, // atdf, avrdude + {"AVR32DA28", 338, F_AVR8X, {0x1E, 0x95, 0x34}, 0, 0x08000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x7000, 0x1000, 16, 4, 41, vtab_avr128da28}, // atdf, avrdude + {"AVR32DB28", 339, F_AVR8X, {0x1E, 0x95, 0x37}, 0, 0x08000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x7000, 0x1000, 16, 4, 42, vtab_avr128db28}, // atdf, avrdude + {"AVR32DD28", 340, F_AVR8X, {0x1E, 0x95, 0x39}, 0, 0x08000, 0x200, 1, 0, 0x01400, 0x0100, 1, 0x7000, 0x1000, 16, 4, 36, vtab_avr64dd32}, // atdf, avrdude + {"AVR32EA28", 341, F_AVR8X, {0x1E, 0x95, 0x3E}, 0, 0x08000, 0x040, 1, 0, 0x01400, 0x0200, 8, -1, -1, -1, -1, 0, NULL}, // avrdude + {"AVR32DA32", 342, F_AVR8X, {0x1E, 0x95, 0x33}, 0, 0x08000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x7000, 0x1000, 16, 4, 44, vtab_avr128da32}, // atdf, avrdude + {"AVR32DB32", 343, F_AVR8X, {0x1E, 0x95, 0x36}, 0, 0x08000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x7000, 0x1000, 16, 4, 44, vtab_avr128db32}, // atdf, avrdude + {"AVR32DD32", 344, F_AVR8X, {0x1E, 0x95, 0x38}, 0, 0x08000, 0x200, 1, 0, 0x01400, 0x0100, 1, 0x7000, 0x1000, 16, 4, 36, vtab_avr64dd32}, // atdf, avrdude + {"AVR32EA32", 345, F_AVR8X, {0x1E, 0x95, 0x3D}, 0, 0x08000, 0x040, 1, 0, 0x01400, 0x0200, 8, -1, -1, -1, -1, 0, NULL}, // avrdude + {"AVR32DA48", 346, F_AVR8X, {0x1E, 0x95, 0x32}, 0, 0x08000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x7000, 0x1000, 16, 4, 58, vtab_avr128da48}, // atdf, avrdude + {"AVR32DB48", 347, F_AVR8X, {0x1E, 0x95, 0x35}, 0, 0x08000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x7000, 0x1000, 16, 4, 61, vtab_avr128db48}, // atdf, avrdude + {"AVR32EA48", 348, F_AVR8X, {0x1E, 0x95, 0x3C}, 0, 0x08000, 0x040, 1, 0, 0x01400, 0x0200, 8, -1, -1, -1, -1, 0, NULL}, // avrdude + {"AVR64DD14", 349, F_AVR8X, {0x1E, 0x96, 0x1D}, 0, 0x10000, 0x200, 1, 0, 0x01400, 0x0100, 1, 0x6000, 0x2000, 16, 4, 36, vtab_avr64dd32}, // atdf, avrdude + {"AVR64DD20", 350, F_AVR8X, {0x1E, 0x96, 0x1C}, 0, 0x10000, 0x200, 1, 0, 0x01400, 0x0100, 1, 0x6000, 0x2000, 16, 4, 36, vtab_avr64dd32}, // atdf, avrdude + {"AVR64DA28", 351, F_AVR8X, {0x1E, 0x96, 0x15}, 0, 0x10000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x6000, 0x2000, 16, 4, 41, vtab_avr128da28}, // atdf, avrdude + {"AVR64DB28", 352, F_AVR8X, {0x1E, 0x96, 0x19}, 0, 0x10000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x6000, 0x2000, 16, 4, 42, vtab_avr128db28}, // atdf, avrdude + {"AVR64DD28", 353, F_AVR8X, {0x1E, 0x96, 0x1B}, 0, 0x10000, 0x200, 1, 0, 0x01400, 0x0100, 1, 0x6000, 0x2000, 16, 4, 36, vtab_avr64dd32}, // atdf, avrdude + {"AVR64EA28", 354, F_AVR8X, {0x1E, 0x96, 0x20}, 0, 0x10000, 0x080, 1, 0, 0x01400, 0x0200, 8, 0x6800, 0x1800, 16, 4, 37, vtab_avr64ea32}, // atdf, avrdude + {"AVR64DA32", 355, F_AVR8X, {0x1E, 0x96, 0x14}, 0, 0x10000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x6000, 0x2000, 16, 4, 44, vtab_avr128da32}, // atdf, avrdude + {"AVR64DB32", 356, F_AVR8X, {0x1E, 0x96, 0x18}, 0, 0x10000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x6000, 0x2000, 16, 4, 44, vtab_avr128db32}, // atdf, avrdude + {"AVR64DD32", 357, F_AVR8X, {0x1E, 0x96, 0x1A}, 0, 0x10000, 0x200, 1, 0, 0x01400, 0x0100, 1, 0x6000, 0x2000, 16, 4, 36, vtab_avr64dd32}, // atdf, avrdude + {"AVR64EA32", 358, F_AVR8X, {0x1E, 0x96, 0x1F}, 0, 0x10000, 0x080, 1, 0, 0x01400, 0x0200, 8, 0x6800, 0x1800, 16, 4, 37, vtab_avr64ea32}, // atdf, avrdude + {"AVR64DA48", 359, F_AVR8X, {0x1E, 0x96, 0x13}, 0, 0x10000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x6000, 0x2000, 16, 4, 58, vtab_avr128da48}, // atdf, avrdude + {"AVR64DB48", 360, F_AVR8X, {0x1E, 0x96, 0x17}, 0, 0x10000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x6000, 0x2000, 16, 4, 61, vtab_avr128db48}, // atdf, avrdude + {"AVR64EA48", 361, F_AVR8X, {0x1E, 0x96, 0x1E}, 0, 0x10000, 0x080, 1, 0, 0x01400, 0x0200, 8, 0x6800, 0x1800, 16, 4, 45, vtab_avr64ea48}, // atdf, avrdude + {"AVR64DA64", 362, F_AVR8X, {0x1E, 0x96, 0x12}, 0, 0x10000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x6000, 0x2000, 16, 4, 64, vtab_avr128da64}, // atdf, avrdude + {"AVR64DB64", 363, F_AVR8X, {0x1E, 0x96, 0x16}, 0, 0x10000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x6000, 0x2000, 16, 4, 65, vtab_avr128db64}, // atdf, avrdude + {"AVR128DA28", 364, F_AVR8X, {0x1E, 0x97, 0x0A}, 0, 0x20000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x4000, 0x4000, 16, 4, 41, vtab_avr128da28}, // atdf, avrdude + {"AVR128DB28", 365, F_AVR8X, {0x1E, 0x97, 0x0E}, 0, 0x20000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x4000, 0x4000, 16, 4, 42, vtab_avr128db28}, // atdf, avrdude + {"AVR128DA32", 366, F_AVR8X, {0x1E, 0x97, 0x09}, 0, 0x20000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x4000, 0x4000, 16, 4, 44, vtab_avr128da32}, // atdf, avrdude + {"AVR128DB32", 367, F_AVR8X, {0x1E, 0x97, 0x0D}, 0, 0x20000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x4000, 0x4000, 16, 4, 44, vtab_avr128db32}, // atdf, avrdude + {"AVR128DA48", 368, F_AVR8X, {0x1E, 0x97, 0x08}, 0, 0x20000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x4000, 0x4000, 16, 4, 58, vtab_avr128da48}, // atdf, avrdude + {"AVR128DB48", 369, F_AVR8X, {0x1E, 0x97, 0x0C}, 0, 0x20000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x4000, 0x4000, 16, 4, 61, vtab_avr128db48}, // atdf, avrdude + {"AVR128DA64", 370, F_AVR8X, {0x1E, 0x97, 0x07}, 0, 0x20000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x4000, 0x4000, 16, 4, 64, vtab_avr128da64}, // atdf, avrdude + {"AVR128DB64", 371, F_AVR8X, {0x1E, 0x97, 0x0B}, 0, 0x20000, 0x200, 1, 0, 0x01400, 0x0200, 1, 0x4000, 0x4000, 16, 4, 65, vtab_avr128db64}, // atdf, avrdude +}; + +const char * const vtab_attiny9[vts_attiny9] = { // ATtiny9, ATtiny4 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "PCINT0", // 2: Pin Change Interrupt 0 + "TIM0_CAPT", // 3: Timer 0 Capture Event + "TIM0_OVF", // 4: Timer 0 Overflow + "TIM0_COMPA", // 5: Timer 0 Compare Match A + "TIM0_COMPB", // 6: Timer 0 Compare Match B + "ANA_COMP", // 7: Analog Comparator + "WDT", // 8: Watchdog Time-out + "VLM", // 9: Vcc Voltage Level Monitor +}; + +const char * const vtab_attiny10[vts_attiny10] = { // ATtiny10, ATtiny5 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "PCINT0", // 2: Pin Change Interrupt 0 + "TIM0_CAPT", // 3: Timer 0 Capture Event + "TIM0_OVF", // 4: Timer 0 Overflow + "TIM0_COMPA", // 5: Timer 0 Compare Match A + "TIM0_COMPB", // 6: Timer 0 Compare Match B + "ANA_COMP", // 7: Analog Comparator + "WDT", // 8: Watchdog Time-out + "VLM", // 9: Vcc Voltage Level Monitor + "ADC", // 10: ADC Conversion Complete +}; + +const char * const vtab_attiny20[vts_attiny20] = { // ATtiny20 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "PCINT0", // 2: Pin Change Interrupt 0 + "PCINT1", // 3: Pin Change Interrupt 1 + "WDT", // 4: Watchdog Time-out + "TIM1_CAPT", // 5: Timer 1 Capture Event + "TIM1_COMPA", // 6: Timer 1 Compare Match A + "TIM1_COMPB", // 7: Timer 1 Compare Match B + "TIM1_OVF", // 8: Timer 1 Overflow + "TIM0_COMPA", // 9: Timer 0 Compare Match A + "TIM0_COMPB", // 10: Timer 0 Compare Match B + "TIM0_OVF", // 11: Timer 0 Overflow + "ANA_COMP", // 12: Analog Comparator + "ADC_ADC", // 13: Conversion Complete + "TWI_SLAVE", // 14: 2-Wire Interface Periphery + "SPI", // 15: SPI Serial Peripheral Interface + "QTRIP", // 16: Touch Sensing +}; + +const char * const vtab_attiny40[vts_attiny40] = { // ATtiny40 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "PCINT0", // 2: Pin Change Interrupt 0 + "PCINT1", // 3: Pin Change Interrupt 1 + "PCINT2", // 4: Pin Change Interrupt 2 + "WDT", // 5: Watchdog Time-out + "TIM1_CAPT", // 6: Timer 1 Capture Event + "TIM1_COMPA", // 7: Timer 1 Compare Match A + "TIM1_COMPB", // 8: Timer 1 Compare Match B + "TIM1_OVF", // 9: Timer 1 Overflow + "TIM0_COMPA", // 10: Timer 0 Compare Match A + "TIM0_COMPB", // 11: Timer 0 Compare Match B + "TIM0_OVF", // 12: Timer 0 Overflow + "ANA_COMP", // 13: Analog Comparator + "ADC", // 14: ADC Conversion Complete + "TWI_SLAVE", // 15: 2-Wire Interface Periphery + "SPI", // 16: SPI Serial Peripheral Interface + "QTRIP", // 17: Touch Sensing +}; + +const char * const vtab_attiny104[vts_attiny104] = { // ATtiny104, ATtiny102 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "PCINT0", // 2: Pin Change Interrupt 0 + "PCINT1", // 3: Pin Change Interrupt 1 + "TIM0_CAPT", // 4: Timer 0 Capture Event + "TIM0_OVF", // 5: Timer 0 Overflow + "TIM0_COMPA", // 6: Timer 0 Compare Match A + "TIM0_COMPB", // 7: Timer 0 Compare Match B + "ANA_COMP", // 8: Analog Comparator + "WDT", // 9: Watchdog Time-out + "VLM", // 10: Vcc Voltage Level Monitor + "ADC", // 11: ADC Conversion Complete + "USART_RXS", // 12: USART Receive Start + "USART_RXC", // 13: USART Receive Complete + "USART_DRE", // 14: USART Data Register Empty + "USART_TXC", // 15: USART Transmit Complete +}; + +const char * const vtab_attiny11[vts_attiny11] = { // ATtiny11 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "IO_PINS", // 2: External Interrupt + "TIMER0_OVF", // 3: Timer 0 Overflow + "ANA_COMP", // 4: Analog Comparator +}; + +const char * const vtab_attiny12[vts_attiny12] = { // ATtiny12 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "IO_PINS", // 2: External Interrupt + "TIMER0_OVF", // 3: Timer 0 Overflow + "EE_RDY", // 4: EEPROM Ready + "ANA_COMP", // 5: Analog Comparator +}; + +const char * const vtab_attiny13a[vts_attiny13a] = { // ATtiny13A, ATtiny13 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "PCINT0", // 2: Pin Change Interrupt 0 + "TIM0_OVF", // 3: Timer 0 Overflow + "EE_RDY", // 4: EEPROM Ready + "ANA_COMP", // 5: Analog Comparator + "TIM0_COMPA", // 6: Timer 0 Compare Match A + "TIM0_COMPB", // 7: Timer 0 Compare Match B + "WDT", // 8: Watchdog Time-out + "ADC", // 9: ADC Conversion Complete +}; + +const char * const vtab_attiny15[vts_attiny15] = { // ATtiny15 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "IO_PINS", // 2: External Interrupt + "TIMER1_COMP", // 3: Timer 1 Compare + "TIMER1_OVF", // 4: Timer 1 Overflow + "TIMER0_OVF", // 5: Timer 0 Overflow + "EE_RDY", // 6: EEPROM Ready + "ANA_COMP", // 7: Analog Comparator + "ADC", // 8: ADC Conversion Complete +}; + +const char * const vtab_attiny22[vts_attiny22] = { // ATtiny22, AT90S2343, AT90S2323 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "TIMER0_OVF0", // 2: Timer 0 Overflow +}; + +const char * const vtab_attiny26[vts_attiny26] = { // ATtiny26 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "IO_PINS", // 2: External Interrupt + "TIMER1_CMPA", // 3: Timer 1 Compare Match A + "TIMER1_CMPB", // 4: Timer 1 Compare Match B + "TIMER1_OVF1", // 5: Timer 1 Overflow + "TIMER0_OVF0", // 6: Timer 0 Overflow + "USI_STRT", // 7: USI Start Condition + "USI_OVF", // 8: USI Overflow + "EE_RDY", // 9: EEPROM Ready + "ANA_COMP", // 10: Analog Comparator + "ADC", // 11: ADC Conversion Complete +}; + +const char * const vtab_attiny28[vts_attiny28] = { // ATtiny28 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "LOW_LEVEL_IO_PINS", // 3: Low-level Input + "TIMER0_OVF", // 4: Timer 0 Overflow + "ANA_COMP", // 5: Analog Comparator +}; + +const char * const vtab_attiny43u[vts_attiny43u] = { // ATtiny43U + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "PCINT0", // 2: Pin Change Interrupt 0 + "PCINT1", // 3: Pin Change Interrupt 1 + "WDT", // 4: Watchdog Time-out + "TIM1_COMPA", // 5: Timer 1 Compare Match A + "TIM1_COMPB", // 6: Timer 1 Compare Match B + "TIM1_OVF", // 7: Timer 1 Overflow + "TIM0_COMPA", // 8: Timer 0 Compare Match A + "TIM0_COMPB", // 9: Timer 0 Compare Match B + "TIM0_OVF", // 10: Timer 0 Overflow + "ANA_COMP", // 11: Analog Comparator + "ADC", // 12: ADC Conversion Complete + "EE_RDY", // 13: EEPROM Ready + "USI_START", // 14: USI Start Condition + "USI_OVF", // 15: USI Overflow +}; + +const char * const vtab_attiny84a[vts_attiny84a] = { // ATtiny84A, ATtiny84, ATtiny44A, ATtiny44, ATtiny24A, ATtiny24 + "RESET", // 0: Reset (various reasons) + "EXT_INT0", // 1: External Interrupt 0 + "PCINT0", // 2: Pin Change Interrupt 0 + "PCINT1", // 3: Pin Change Interrupt 1 + "WDT", // 4: Watchdog Time-out + "TIM1_CAPT", // 5: Timer 1 Capture Event + "TIM1_COMPA", // 6: Timer 1 Compare Match A + "TIM1_COMPB", // 7: Timer 1 Compare Match B + "TIM1_OVF", // 8: Timer 1 Overflow + "TIM0_COMPA", // 9: Timer 0 Compare Match A + "TIM0_COMPB", // 10: Timer 0 Compare Match B + "TIM0_OVF", // 11: Timer 0 Overflow + "ANA_COMP", // 12: Analog Comparator + "ADC", // 13: ADC Conversion Complete + "EE_RDY", // 14: EEPROM Ready + "USI_STR", // 15: USI Start Condition + "USI_OVF", // 16: USI Overflow +}; + +const char * const vtab_attiny85[vts_attiny85] = { // ATtiny85, ATtiny45, ATtiny25 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "PCINT0", // 2: Pin Change Interrupt 0 + "TIMER1_COMPA", // 3: Timer 1 Compare Match A + "TIMER1_OVF", // 4: Timer 1 Overflow + "TIMER0_OVF", // 5: Timer 0 Overflow + "EE_RDY", // 6: EEPROM Ready + "ANA_COMP", // 7: Analog Comparator + "ADC", // 8: ADC Conversion Complete + "TIMER1_COMPB", // 9: Timer 1 Compare Match B + "TIMER0_COMPA", // 10: Timer 0 Compare Match A + "TIMER0_COMPB", // 11: Timer 0 Compare Match B + "WDT", // 12: Watchdog Time-out + "USI_START", // 13: USI Start Condition + "USI_OVF", // 14: USI Overflow +}; + +const char * const vtab_attiny88[vts_attiny88] = { // ATtiny88, ATtiny48 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "PCINT0", // 3: Pin Change Interrupt 0 + "PCINT1", // 4: Pin Change Interrupt 1 + "PCINT2", // 5: Pin Change Interrupt 2 + "PCINT3", // 6: Pin Change Interrupt 3 + "WDT", // 7: Watchdog Time-out + "TIMER1_CAPT", // 8: Timer 1 Capture Event + "TIMER1_COMPA", // 9: Timer 1 Compare Match A + "TIMER1_COMPB", // 10: Timer 1 Compare Match B + "TIMER1_OVF", // 11: Timer 1 Overflow + "TIMER0_COMPA", // 12: Timer 0 Compare Match A + "TIMER0_COMPB", // 13: Timer 0 Compare Match B + "TIMER0_OVF", // 14: Timer 0 Overflow + "SPI_STC", // 15: SPI Serial Transfer Complete + "ADC", // 16: ADC Conversion Complete + "EE_RDY", // 17: EEPROM Ready + "ANALOG_COMP", // 18: Analog Comparator + "TWI", // 19: 2-Wire Interface +}; + +const char * const vtab_attiny167[vts_attiny167] = { // ATtiny167, ATtiny87, ATA664251, ATA6617C, ATA6616C, ATA5505 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "PCINT0", // 3: Pin Change Interrupt 0 + "PCINT1", // 4: Pin Change Interrupt 1 + "WDT", // 5: Watchdog Time-out + "TIMER1_CAPT", // 6: Timer 1 Capture Event + "TIMER1_COMPA", // 7: Timer 1 Compare Match A + "TIMER1_COMPB", // 8: Timer 1 Compare Match B + "TIMER1_OVF", // 9: Timer 1 Overflow + "TIMER0_COMPA", // 10: Timer 0 Compare Match A + "TIMER0_OVF", // 11: Timer 0 Overflow + "LIN_TC", // 12: LIN Transfer Complete + "LIN_ERR", // 13: LIN Error + "SPI_STC", // 14: SPI Serial Transfer Complete + "ADC", // 15: ADC Conversion Complete + "EE_RDY", // 16: EEPROM Ready + "ANA_COMP", // 17: Analog Comparator + "USI_START", // 18: USI Start Condition + "USI_OVF", // 19: USI Overflow +}; + +const char * const vtab_attiny828[vts_attiny828] = { // ATtiny828 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "PCINT0", // 3: Pin Change Interrupt 0 + "PCINT1", // 4: Pin Change Interrupt 1 + "PCINT2", // 5: Pin Change Interrupt 2 + "PCINT3", // 6: Pin Change Interrupt 3 + "WDT", // 7: Watchdog Time-out + "TIMER1_CAPT", // 8: Timer 1 Capture Event + "TIMER1_COMPA", // 9: Timer 1 Compare Match A + "TIMER1_COMPB", // 10: Timer 1 Compare Match B + "TIMER1_OVF", // 11: Timer 1 Overflow + "TIMER0_COMPA", // 12: Timer 0 Compare Match A + "TIMER0_COMPB", // 13: Timer 0 Compare Match B + "TIMER0_OVF", // 14: Timer 0 Overflow + "SPI_STC", // 15: SPI Serial Transfer Complete + "USART_START", // 16: USART Start + "USART_RX", // 17: USART Receive Complete + "USART_UDRE", // 18: USART Data Register Empty + "USART_TX", // 19: USART Transmit Complete + "ADC", // 20: ADC Conversion Complete + "EE_READY", // 21: EEPROM Ready + "ANALOG_COMP", // 22: Analog Comparator + "TWI_SLAVE", // 23: 2-Wire Interface Periphery + "SPM_Ready", // 24: Store Program Memory Ready + "QTRIP", // 25: Touch Sensing +}; + +const char * const vtab_attiny841[vts_attiny841] = { // ATtiny841, ATtiny441 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "PCINT0", // 2: Pin Change Interrupt 0 + "PCINT1", // 3: Pin Change Interrupt 1 + "WDT", // 4: Watchdog Time-out + "TIMER1_CAPT", // 5: Timer 1 Capture Event + "TIMER1_COMPA", // 6: Timer 1 Compare Match A + "TIMER1_COMPB", // 7: Timer 1 Compare Match B + "TIMER1_OVF", // 8: Timer 1 Overflow + "TIMER0_COMPA", // 9: Timer 0 Compare Match A + "TIMER0_COMPB", // 10: Timer 0 Compare Match B + "TIMER0_OVF", // 11: Timer 0 Overflow + "ANA_COMP0", // 12: Analog Comparator 0 + "ADC", // 13: ADC Conversion Complete + "EE_RDY", // 14: EEPROM Ready + "ANA_COMP1", // 15: Analog Comparator 1 + "TIMER2_CAPT", // 16: Timer 2 Capture Event + "TIMER2_COMPA", // 17: Timer 2 Compare Match A + "TIMER2_COMPB", // 18: Timer 2 Compare Match B + "TIMER2_OVF", // 19: Timer 2 Overflow + "SPI", // 20: SPI Serial Peripheral Interface + "USART0_START", // 21: USART 0 Receive Start + "USART0_RX", // 22: USART 0 Receive Complete + "USART0_UDRE", // 23: USART 0 Data Register Empty + "USART0_TX", // 24: USART 0 Transmit Complete + "USART1_START", // 25: USART 1 Receive Start + "USART1_RX", // 26: USART 1 Receive Complete + "USART1_UDRE", // 27: USART 1 Data Register Empty + "USART1_TX", // 28: USART 1 Transmit Complete + "TWI_SLAVE", // 29: 2-Wire Interface Periphery +}; + +const char * const vtab_attiny861a[vts_attiny861a] = { // ATtiny861A, ATtiny861, ATtiny461A, ATtiny461, ATtiny261A, ATtiny261 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "PCINT", // 2: Pin Change Interrupt + "TIMER1_COMPA", // 3: Timer 1 Compare Match A + "TIMER1_COMPB", // 4: Timer 1 Compare Match B + "TIMER1_OVF", // 5: Timer 1 Overflow + "TIMER0_OVF", // 6: Timer 0 Overflow + "USI_START", // 7: USI Start Condition + "USI_OVF", // 8: USI Overflow + "EE_RDY", // 9: EEPROM Ready + "ANA_COMP", // 10: Analog Comparator + "ADC", // 11: ADC Conversion Complete + "WDT", // 12: Watchdog Time-out + "INT1", // 13: External Interrupt 1 + "TIMER0_COMPA", // 14: Timer 0 Compare Match A + "TIMER0_COMPB", // 15: Timer 0 Compare Match B + "TIMER0_CAPT", // 16: Timer 0 Capture Event + "TIMER1_COMPD", // 17: Timer 1 Compare Match D + "FAULT_PROTECTION", // 18: Timer 1 Fault Protection +}; + +const char * const vtab_attiny1634[vts_attiny1634] = { // ATtiny1634 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "PCINT0", // 2: Pin Change Interrupt 0 + "PCINT1", // 3: Pin Change Interrupt 1 + "PCINT2", // 4: Pin Change Interrupt 2 + "WDT", // 5: Watchdog Time-out + "TIMER1_CAPT", // 6: Timer 1 Capture Event + "TIMER1_COMPA", // 7: Timer 1 Compare Match A + "TIMER1_COMPB", // 8: Timer 1 Compare Match B + "TIMER1_OVF", // 9: Timer 1 Overflow + "TIMER0_COMPA", // 10: Timer 0 Compare Match A + "TIMER0_COMPB", // 11: Timer 0 Compare Match B + "TIMER0_OVF", // 12: Timer 0 Overflow + "ANA_COMP", // 13: Analog Comparator + "ADC_READY", // 14: ADC Conversion Complete + "USART0_START", // 15: USART 0 Receive Start + "USART0_RXC", // 16: USART 0 Receive Complete + "USART0_UDRE", // 17: USART 0 Data Register Empty + "USART0_TXC", // 18: USART 0 Transmit Complete + "USART1_START", // 19: USART 1 Receive Start + "USART1_RXC", // 20: USART 1 Receive Complete + "USART1_UDRE", // 21: USART 1 Data Register Empty + "USART1_TXC", // 22: USART 1 Transmit Complete + "USI_START", // 23: USI Start Condition + "USI_OVERFLOW", // 24: USI Overflow + "TWI/TWI_SLAVE", // 25: 2-Wire Interface/2-Wire Interface Periphery + "EE_RDY", // 26: EEPROM Ready + "QTRIP", // 27: Touch Sensing +}; + +const char * const vtab_attiny2313[vts_attiny2313] = { // ATtiny2313 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "TIMER1_CAPT", // 3: Timer 1 Capture Event + "TIMER1_COMPA", // 4: Timer 1 Compare Match A + "TIMER1_OVF", // 5: Timer 1 Overflow + "TIMER0_OVF", // 6: Timer 0 Overflow + "USART_RX", // 7: USART Receive Complete + "USART_UDRE", // 8: USART Data Register Empty + "USART_TX", // 9: USART Transmit Complete + "ANA_COMP", // 10: Analog Comparator + "PCINT", // 11: Pin Change Interrupt + "TIMER1_COMPB", // 12: Timer 1 Compare Match B + "TIMER0_COMPA", // 13: Timer 0 Compare Match A + "TIMER0_COMPB", // 14: Timer 0 Compare Match B + "USI_START", // 15: USI Start Condition + "USI_OVERFLOW", // 16: USI Overflow + "EEPROM_Ready", // 17: EEPROM Ready + "WDT_OVERFLOW", // 18: Watchdog Timer Overflow +}; + +const char * const vtab_attiny4313[vts_attiny4313] = { // ATtiny4313, ATtiny2313A + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "TIMER1_CAPT", // 3: Timer 1 Capture Event + "TIMER1_COMPA", // 4: Timer 1 Compare Match A + "TIMER1_OVF", // 5: Timer 1 Overflow + "TIMER0_OVF", // 6: Timer 0 Overflow + "USART_RX", // 7: USART Receive Complete + "USART_UDRE", // 8: USART Data Register Empty + "USART_TX", // 9: USART Transmit Complete + "ANA_COMP", // 10: Analog Comparator + "PCINT_B", // 11: Pin Change Interrupt B + "TIMER1_COMPB", // 12: Timer 1 Compare Match B + "TIMER0_COMPA", // 13: Timer 0 Compare Match A + "TIMER0_COMPB", // 14: Timer 0 Compare Match B + "USI_START", // 15: USI Start Condition + "USI_OVERFLOW", // 16: USI Overflow + "EEPROM_Ready", // 17: EEPROM Ready + "WDT_OVERFLOW", // 18: Watchdog Timer Overflow + "PCINT_A", // 19: Pin Change Interrupt A + "PCINT_D", // 20: Pin Change Interrupt D +}; + +const char * const vtab_atmega8a[vts_atmega8a] = { // ATmega8A, ATmega8 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "TIMER2_COMP", // 3: Timer 2 Compare Match + "TIMER2_OVF", // 4: Timer 2 Overflow + "TIMER1_CAPT", // 5: Timer 1 Capture Event + "TIMER1_COMPA", // 6: Timer 1 Compare Match A + "TIMER1_COMPB", // 7: Timer 1 Compare Match B + "TIMER1_OVF", // 8: Timer 1 Overflow + "TIMER0_OVF", // 9: Timer 0 Overflow + "SPI_STC", // 10: SPI Serial Transfer Complete + "USART_RXC", // 11: USART Receive Complete + "USART_UDRE", // 12: USART Data Register Empty + "USART_TXC", // 13: USART Transmit Complete + "ADC", // 14: ADC Conversion Complete + "EE_RDY", // 15: EEPROM Ready + "ANA_COMP", // 16: Analog Comparator + "TWI", // 17: 2-Wire Interface + "SPM_RDY", // 18: Store Program Memory Ready +}; + +const char * const vtab_atmega16a[vts_atmega16a] = { // ATmega16A, ATmega16 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "TIMER2_COMP", // 3: Timer 2 Compare Match + "TIMER2_OVF", // 4: Timer 2 Overflow + "TIMER1_CAPT", // 5: Timer 1 Capture Event + "TIMER1_COMPA", // 6: Timer 1 Compare Match A + "TIMER1_COMPB", // 7: Timer 1 Compare Match B + "TIMER1_OVF", // 8: Timer 1 Overflow + "TIMER0_OVF", // 9: Timer 0 Overflow + "SPI_STC", // 10: SPI Serial Transfer Complete + "USART_RXC", // 11: USART Receive Complete + "USART_UDRE", // 12: USART Data Register Empty + "USART_TXC", // 13: USART Transmit Complete + "ADC", // 14: ADC Conversion Complete + "EE_RDY", // 15: EEPROM Ready + "ANA_COMP", // 16: Analog Comparator + "TWI", // 17: 2-Wire Interface + "INT2", // 18: External Interrupt 2 + "TIMER0_COMP", // 19: Timer 0 Compare Match + "SPM_RDY", // 20: Store Program Memory Ready +}; + +const char * const vtab_atmega16hva[vts_atmega16hva] = { // ATmega16HVA, ATmega8HVA + "RESET", // 0: Reset (various reasons) + "BPINT", // 1: Battery Protection Interrupt + "VREGMON", // 2: Voltage Regulator Monitor + "INT0", // 3: External Interrupt 0 + "INT1", // 4: External Interrupt 1 + "INT2", // 5: External Interrupt 2 + "WDT", // 6: Watchdog Time-out + "TIMER1_IC", // 7: Timer 1 Input Capture + "TIMER1_COMPA", // 8: Timer 1 Compare Match A + "TIMER1_COMPB", // 9: Timer 1 Compare Match B + "TIMER1_OVF", // 10: Timer 1 Overflow + "TIMER0_IC", // 11: Timer 0 Capture Event + "TIMER0_COMPA", // 12: Timer 0 Compare Match A + "TIMER0_COMPB", // 13: Timer 0 Compare Match B + "TIMER0_OVF", // 14: Timer 0 Overflow + "SPI_STC", // 15: SPI Serial Transfer Complete + "VADC", // 16: Voltage ADC Conversion Complete + "CCADC_CONV", // 17: Coulomb Counter ADC Conversion Complete + "CCADC_REG_CUR", // 18: Coloumb Counter ADC Regular Current + "CCADC_ACC", // 19: Coloumb Counter ADC Accumulator + "EE_READY", // 20: EEPROM Ready +}; + +const char * const vtab_atmega16hva2[vts_atmega16hva2] = { // ATmega16HVA2 + "RESET", // 0: Reset (various reasons) + "BPINT", // 1: Battery Protection Interrupt + "VREGMON", // 2: Voltage Regulator Monitor + "INT0", // 3: External Interrupt 0 + "INT1", // 4: External Interrupt 1 + "INT2", // 5: External Interrupt 2 + "PCINT0", // 6: Pin Change Interrupt 0 + "WDT", // 7: Watchdog Time-out + "TIMER1_IC", // 8: Timer 1 Input Capture + "TIMER1_COMPA", // 9: Timer 1 Compare Match A + "TIMER1_COMPB", // 10: Timer 1 Compare Match B + "TIMER1_OVF", // 11: Timer 1 Overflow + "TIMER0_IC", // 12: Timer 0 Capture Event + "TIMER0_COMPA", // 13: Timer 0 Compare Match A + "TIMER0_COMPB", // 14: Timer 0 Compare Match B + "TIMER0_OVF", // 15: Timer 0 Overflow + "SPI_STC", // 16: SPI Serial Transfer Complete + "VADC", // 17: Voltage ADC Conversion Complete + "CCADC_CONV", // 18: Coulomb Counter ADC Conversion Complete + "CCADC_REG_CUR", // 19: Coloumb Counter ADC Regular Current + "CCADC_ACC", // 20: Coloumb Counter ADC Accumulator + "EE_READY", // 21: EEPROM Ready +}; + +const char * const vtab_atmega32hvbrevb[vts_atmega32hvbrevb] = { // ATmega32HVBrevB, ATmega32HVB, ATmega16HVBrevB, ATmega16HVB + "RESET", // 0: Reset (various reasons) + "BPINT", // 1: Battery Protection Interrupt + "VREGMON", // 2: Voltage Regulator Monitor + "INT0", // 3: External Interrupt 0 + "INT1", // 4: External Interrupt 1 + "INT2", // 5: External Interrupt 2 + "INT3", // 6: External Interrupt 3 + "PCINT0", // 7: Pin Change Interrupt 0 + "PCINT1", // 8: Pin Change Interrupt 1 + "WDT", // 9: Watchdog Time-out + "BGSCD", // 10: Bandgap Buffer Short Circuit Detected + "CHDET", // 11: Charger Detect + "TIMER1_IC", // 12: Timer 1 Input Capture + "TIMER1_COMPA", // 13: Timer 1 Compare Match A + "TIMER1_COMPB", // 14: Timer 1 Compare Match B + "TIMER1_OVF", // 15: Timer 1 Overflow + "TIMER0_IC", // 16: Timer 0 Capture Event + "TIMER0_COMPA", // 17: Timer 0 Compare Match A + "TIMER0_COMPB", // 18: Timer 0 Compare Match B + "TIMER0_OVF", // 19: Timer 0 Overflow + "TWIBUSCD", // 20: 2-Wire Interface Bus Connect/Disconnect + "TWI", // 21: 2-Wire Interface + "SPI_STC", // 22: SPI Serial Transfer Complete + "VADC", // 23: Voltage ADC Conversion Complete + "CCADC_CONV", // 24: Coulomb Counter ADC Conversion Complete + "CCADC_REG_CUR", // 25: Coloumb Counter ADC Regular Current + "CCADC_ACC", // 26: Coloumb Counter ADC Accumulator + "EE_READY", // 27: EEPROM Ready + "SPM", // 28: SPM Ready +}; + +const char * const vtab_atmega32u2[vts_atmega32u2] = { // ATmega32U2, ATmega16U2, ATmega8U2, AT90USB162, AT90USB82 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "INT2", // 3: External Interrupt 2 + "INT3", // 4: External Interrupt 3 + "INT4", // 5: External Interrupt 4 + "INT5", // 6: External Interrupt 5 + "INT6", // 7: External Interrupt 6 + "INT7", // 8: External Interrupt 7 + "PCINT0", // 9: Pin Change Interrupt 0 + "PCINT1", // 10: Pin Change Interrupt 1 + "USB_GEN", // 11: USB General + "USB_COM", // 12: USB Endpoint/Pipe Interrupt Communication Request + "WDT", // 13: Watchdog Time-out + "TIMER1_CAPT", // 14: Timer 1 Capture Event + "TIMER1_COMPA", // 15: Timer 1 Compare Match A + "TIMER1_COMPB", // 16: Timer 1 Compare Match B + "TIMER1_COMPC", // 17: Timer 1 Compare Match C + "TIMER1_OVF", // 18: Timer 1 Overflow + "TIMER0_COMPA", // 19: Timer 0 Compare Match A + "TIMER0_COMPB", // 20: Timer 0 Compare Match B + "TIMER0_OVF", // 21: Timer 0 Overflow + "SPI_STC", // 22: SPI Serial Transfer Complete + "USART1_RX", // 23: USART 1 Receive Complete + "USART1_UDRE", // 24: USART 1 Data Register Empty + "USART1_TX", // 25: USART 1 Transmit Complete + "ANALOG_COMP", // 26: Analog Comparator + "EE_READY", // 27: EEPROM Ready + "SPM_READY", // 28: Store Program Memory Ready +}; + +const char * const vtab_atmega32u4[vts_atmega32u4] = { // ATmega32U4, ATmega16U4 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "INT2", // 3: External Interrupt 2 + "INT3", // 4: External Interrupt 3 + "Reserved1", // 5: Reserved 1 + "Reserved2", // 6: Reserved 2 + "INT6", // 7: External Interrupt 6 + "Reserved3", // 8: Reserved 3 + "PCINT0", // 9: Pin Change Interrupt 0 + "USB_GEN", // 10: USB General + "USB_COM", // 11: USB Endpoint/Pipe Interrupt Communication Request + "WDT", // 12: Watchdog Time-out + "Reserved4", // 13: Reserved 4 + "Reserved5", // 14: Reserved 5 + "Reserved6", // 15: Reserved 6 + "TIMER1_CAPT", // 16: Timer 1 Capture Event + "TIMER1_COMPA", // 17: Timer 1 Compare Match A + "TIMER1_COMPB", // 18: Timer 1 Compare Match B + "TIMER1_COMPC", // 19: Timer 1 Compare Match C + "TIMER1_OVF", // 20: Timer 1 Overflow + "TIMER0_COMPA", // 21: Timer 0 Compare Match A + "TIMER0_COMPB", // 22: Timer 0 Compare Match B + "TIMER0_OVF", // 23: Timer 0 Overflow + "SPI_STC", // 24: SPI Serial Transfer Complete + "USART1_RX", // 25: USART 1 Receive Complete + "USART1_UDRE", // 26: USART 1 Data Register Empty + "USART1_TX", // 27: USART 1 Transmit Complete + "ANALOG_COMP", // 28: Analog Comparator + "ADC", // 29: ADC Conversion Complete + "EE_READY", // 30: EEPROM Ready + "TIMER3_CAPT", // 31: Timer 3 Capture Event + "TIMER3_COMPA", // 32: Timer 3 Compare Match A + "TIMER3_COMPB", // 33: Timer 3 Compare Match B + "TIMER3_COMPC", // 34: Timer 3 Compare Match C + "TIMER3_OVF", // 35: Timer 3 Overflow + "TWI", // 36: 2-Wire Interface + "SPM_READY", // 37: Store Program Memory Ready + "TIMER4_COMPA", // 38: Timer 4 Compare Match A + "TIMER4_COMPB", // 39: Timer 4 Compare Match B + "TIMER4_COMPD", // 40: Timer 4 Compare Match D + "TIMER4_OVF", // 41: Timer 4 Overflow + "TIMER4_FPF", // 42: Timer 4 Fault Protection +}; + +const char * const vtab_atmega32u6[vts_atmega32u6] = { // ATmega32U6, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "INT2", // 3: External Interrupt 2 + "INT3", // 4: External Interrupt 3 + "INT4", // 5: External Interrupt 4 + "INT5", // 6: External Interrupt 5 + "INT6", // 7: External Interrupt 6 + "INT7", // 8: External Interrupt 7 + "PCINT0", // 9: Pin Change Interrupt 0 + "USB_GEN", // 10: USB General + "USB_COM", // 11: USB Endpoint/Pipe Interrupt Communication Request + "WDT", // 12: Watchdog Time-out + "TIMER2_COMPA", // 13: Timer 2 Compare Match A + "TIMER2_COMPB", // 14: Timer 2 Compare Match B + "TIMER2_OVF", // 15: Timer 2 Overflow + "TIMER1_CAPT", // 16: Timer 1 Capture Event + "TIMER1_COMPA", // 17: Timer 1 Compare Match A + "TIMER1_COMPB", // 18: Timer 1 Compare Match B + "TIMER1_COMPC", // 19: Timer 1 Compare Match C + "TIMER1_OVF", // 20: Timer 1 Overflow + "TIMER0_COMPA", // 21: Timer 0 Compare Match A + "TIMER0_COMPB", // 22: Timer 0 Compare Match B + "TIMER0_OVF", // 23: Timer 0 Overflow + "SPI_STC", // 24: SPI Serial Transfer Complete + "USART1_RX", // 25: USART 1 Receive Complete + "USART1_UDRE", // 26: USART 1 Data Register Empty + "USART1_TX", // 27: USART 1 Transmit Complete + "ANALOG_COMP", // 28: Analog Comparator + "ADC", // 29: ADC Conversion Complete + "EE_READY", // 30: EEPROM Ready + "TIMER3_CAPT", // 31: Timer 3 Capture Event + "TIMER3_COMPA", // 32: Timer 3 Compare Match A + "TIMER3_COMPB", // 33: Timer 3 Compare Match B + "TIMER3_COMPC", // 34: Timer 3 Compare Match C + "TIMER3_OVF", // 35: Timer 3 Overflow + "TWI", // 36: 2-Wire Interface + "SPM_READY", // 37: Store Program Memory Ready +}; + +const char * const vtab_atmega64m1[vts_atmega64m1] = { // ATmega64M1, ATmega64C1, ATmega32M1, ATmega32C1, ATmega16M1 + "RESET", // 0: Reset (various reasons) + "ANACOMP0", // 1: Analog Comparator 0 + "ANACOMP1", // 2: Analog Comparator 1 + "ANACOMP2", // 3: Analog Comparator 2 + "ANACOMP3", // 4: Analog Comparator 3 + "PSC_FAULT", // 5: PSC Fault + "PSC_EC", // 6: PSC End of Cycle + "INT0", // 7: External Interrupt 0 + "INT1", // 8: External Interrupt 1 + "INT2", // 9: External Interrupt 2 + "INT3", // 10: External Interrupt 3 + "TIMER1_CAPT", // 11: Timer 1 Capture Event + "TIMER1_COMPA", // 12: Timer 1 Compare Match A + "TIMER1_COMPB", // 13: Timer 1 Compare Match B + "TIMER1_OVF", // 14: Timer 1 Overflow + "TIMER0_COMPA", // 15: Timer 0 Compare Match A + "TIMER0_COMPB", // 16: Timer 0 Compare Match B + "TIMER0_OVF", // 17: Timer 0 Overflow + "CAN_INT", // 18: CAN MOB, Burst, General Errors + "CAN_TOVF", // 19: CAN Timer Overflow + "LIN_TC", // 20: LIN Transfer Complete + "LIN_ERR", // 21: LIN Error + "PCINT0", // 22: Pin Change Interrupt 0 + "PCINT1", // 23: Pin Change Interrupt 1 + "PCINT2", // 24: Pin Change Interrupt 2 + "PCINT3", // 25: Pin Change Interrupt 3 + "SPI_STC", // 26: SPI Serial Transfer Complete + "ADC", // 27: ADC Conversion Complete + "WDT", // 28: Watchdog Time-out + "EE_READY", // 29: EEPROM Ready + "SPM_READY", // 30: Store Program Memory Ready +}; + +const char * const vtab_atmega64hve2[vts_atmega64hve2] = { // ATmega64HVE2, ATmega64HVE + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "PCINT0", // 2: Pin Change Interrupt 0 + "PCINT1", // 3: Pin Change Interrupt 1 + "WDT", // 4: Watchdog Time-out + "WAKEUP", // 5: Wake Up + "TIMER1_IC", // 6: Timer 1 Input Capture + "TIMER1_COMPA", // 7: Timer 1 Compare Match A + "TIMER1_COMPB", // 8: Timer 1 Compare Match B + "TIMER1_OVF", // 9: Timer 1 Overflow + "TIMER0_IC", // 10: Timer 0 Capture Event + "TIMER0_COMPA", // 11: Timer 0 Compare Match A + "TIMER0_COMPB", // 12: Timer 0 Compare Match B + "TIMER0_OVF", // 13: Timer 0 Overflow + "LIN_STATUS", // 14: Local Interconnect Network Status + "LIN_ERROR", // 15: Local Interconnect Network Error + "SPI_STC", // 16: SPI Serial Transfer Complete + "VADC_CONV", // 17: Versatile Analog to Digital Conversion + "VADC_ACC", // 18: Versatile Analog to Digital Compare or Capture + "CADC_CONV", // 19: C-ADC Instantaneous Conversion Complete + "CADC_REG_CUR", // 20: C-ADC Regular Current + "CADC_ACC", // 21: C-ADC Accumulated Conversion Complete + "EE_READY", // 22: EEPROM Ready + "SPM", // 23: SPM Ready + "PLL", // 24: PLL +}; + +const char * const vtab_atmega103[vts_atmega103] = { // ATmega103 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "INT2", // 3: External Interrupt 2 + "INT3", // 4: External Interrupt 3 + "INT4", // 5: External Interrupt 4 + "INT5", // 6: External Interrupt 5 + "INT6", // 7: External Interrupt 6 + "INT7", // 8: External Interrupt 7 + "TIMER2_COMP", // 9: Timer 2 Compare Match + "TIMER2_OVF", // 10: Timer 2 Overflow + "TIMER1_CAPT", // 11: Timer 1 Capture Event + "TIMER1_COMPA", // 12: Timer 1 Compare Match A + "TIMER1_COMPB", // 13: Timer 1 Compare Match B + "TIMER1_OVF", // 14: Timer 1 Overflow + "TIMER0_COMP", // 15: Timer 0 Compare Match + "TIMER0_OVF", // 16: Timer 0 Overflow + "SPI_STC", // 17: SPI Serial Transfer Complete + "UART_RX", // 18: UART Receive Complete + "UART_UDRE", // 19: UART Data Register Empty + "UART_TX", // 20: UART Transmit Complete + "ADC", // 21: ADC Conversion Complete + "EE_READY", // 22: EEPROM Ready + "ANALOG_COMP", // 23: Analog Comparator +}; + +const char * const vtab_atmega128a[vts_atmega128a] = { // ATmega128A, ATmega128, ATmega64A, ATmega64 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "INT2", // 3: External Interrupt 2 + "INT3", // 4: External Interrupt 3 + "INT4", // 5: External Interrupt 4 + "INT5", // 6: External Interrupt 5 + "INT6", // 7: External Interrupt 6 + "INT7", // 8: External Interrupt 7 + "TIMER2_COMP", // 9: Timer 2 Compare Match + "TIMER2_OVF", // 10: Timer 2 Overflow + "TIMER1_CAPT", // 11: Timer 1 Capture Event + "TIMER1_COMPA", // 12: Timer 1 Compare Match A + "TIMER1_COMPB", // 13: Timer 1 Compare Match B + "TIMER1_OVF", // 14: Timer 1 Overflow + "TIMER0_COMP", // 15: Timer 0 Compare Match + "TIMER0_OVF", // 16: Timer 0 Overflow + "SPI_STC", // 17: SPI Serial Transfer Complete + "USART0_RX", // 18: USART 0 Receive Complete + "USART0_UDRE", // 19: USART 0 Data Register Empty + "USART0_TX", // 20: USART 0 Transmit Complete + "ADC", // 21: ADC Conversion Complete + "EE_READY", // 22: EEPROM Ready + "ANALOG_COMP", // 23: Analog Comparator + "TIMER1_COMPC", // 24: Timer 1 Compare Match C + "TIMER3_CAPT", // 25: Timer 3 Capture Event + "TIMER3_COMPA", // 26: Timer 3 Compare Match A + "TIMER3_COMPB", // 27: Timer 3 Compare Match B + "TIMER3_COMPC", // 28: Timer 3 Compare Match C + "TIMER3_OVF", // 29: Timer 3 Overflow + "USART1_RX", // 30: USART 1 Receive Complete + "USART1_UDRE", // 31: USART 1 Data Register Empty + "USART1_TX", // 32: USART 1 Transmit Complete + "TWI", // 33: 2-Wire Interface + "SPM_READY", // 34: Store Program Memory Ready +}; + +const char * const vtab_atmega128rfa1[vts_atmega128rfa1] = { // ATmega128RFA1 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "INT2", // 3: External Interrupt 2 + "INT3", // 4: External Interrupt 3 + "INT4", // 5: External Interrupt 4 + "INT5", // 6: External Interrupt 5 + "INT6", // 7: External Interrupt 6 + "INT7", // 8: External Interrupt 7 + "PCINT0", // 9: Pin Change Interrupt 0 + "PCINT1", // 10: Pin Change Interrupt 1 + "PCINT2", // 11: Pin Change Interrupt 2 + "WDT", // 12: Watchdog Time-out + "TIMER2_COMPA", // 13: Timer 2 Compare Match A + "TIMER2_COMPB", // 14: Timer 2 Compare Match B + "TIMER2_OVF", // 15: Timer 2 Overflow + "TIMER1_CAPT", // 16: Timer 1 Capture Event + "TIMER1_COMPA", // 17: Timer 1 Compare Match A + "TIMER1_COMPB", // 18: Timer 1 Compare Match B + "TIMER1_COMPC", // 19: Timer 1 Compare Match C + "TIMER1_OVF", // 20: Timer 1 Overflow + "TIMER0_COMPA", // 21: Timer 0 Compare Match A + "TIMER0_COMPB", // 22: Timer 0 Compare Match B + "TIMER0_OVF", // 23: Timer 0 Overflow + "SPI_STC", // 24: SPI Serial Transfer Complete + "USART0_RX", // 25: USART 0 Receive Complete + "USART0_UDRE", // 26: USART 0 Data Register Empty + "USART0_TX", // 27: USART 0 Transmit Complete + "ANALOG_COMP", // 28: Analog Comparator + "ADC", // 29: ADC Conversion Complete + "EE_READY", // 30: EEPROM Ready + "TIMER3_CAPT", // 31: Timer 3 Capture Event + "TIMER3_COMPA", // 32: Timer 3 Compare Match A + "TIMER3_COMPB", // 33: Timer 3 Compare Match B + "TIMER3_COMPC", // 34: Timer 3 Compare Match C + "TIMER3_OVF", // 35: Timer 3 Overflow + "USART1_RX", // 36: USART 1 Receive Complete + "USART1_UDRE", // 37: USART 1 Data Register Empty + "USART1_TX", // 38: USART 1 Transmit Complete + "TWI", // 39: 2-Wire Interface + "SPM_READY", // 40: Store Program Memory Ready + "TIMER4_CAPT", // 41: Timer 4 Capture Event + "TIMER4_COMPA", // 42: Timer 4 Compare Match A + "TIMER4_COMPB", // 43: Timer 4 Compare Match B + "TIMER4_COMPC", // 44: Timer 4 Compare Match C + "TIMER4_OVF", // 45: Timer 4 Overflow + "TIMER5_CAPT", // 46: Timer 5 Capture Event + "TIMER5_COMPA", // 47: Timer 5 Compare Match A + "TIMER5_COMPB", // 48: Timer 5 Compare Match B + "TIMER5_COMPC", // 49: Timer 5 Compare Match C + "TIMER5_OVF", // 50: Timer 5 Overflow + "USART2_RX", // 51: USART 2 Receive Complete + "USART2_UDRE", // 52: USART 2 Data Register Empty + "USART2_TX", // 53: USART 2 Transmit Complete + "USART3_RX", // 54: USART 3 Receive Complete + "USART3_UDRE", // 55: USART 3 Data Register Empty + "USART3_TX", // 56: USART 3 Transmit Complete + "TRX24_PLL_LOCK", // 57: TRX24 PLL Lock + "TRX24_PLL_UNLOCK", // 58: TRX24 PLL Unlock + "TRX24_RX_START", // 59: TRX24 Receive Start + "TRX24_RX_END", // 60: TRX24 Receive End + "TRX24_CCA_ED_DONE", // 61: TRX24 CCA/ED Done + "TRX24_XAH_AMI", // 62: TRX24 XAH/AMI + "TRX24_TX_END", // 63: TRX24 Transmit End + "TRX24_AWAKE", // 64: TRX24 AWAKE - Transceiver is Reaching State TRX_OFF + "SCNT_CMP1", // 65: Symbol Counter - Compare Match 1 Interrupt + "SCNT_CMP2", // 66: Symbol Counter - Compare Match 2 Interrupt + "SCNT_CMP3", // 67: Symbol Counter - Compare Match 3 Interrupt + "SCNT_OVFL", // 68: Symbol Counter - Overflow Interrupt + "SCNT_BACKOFF", // 69: Symbol Counter - Backoff Interrupt + "AES_READY", // 70: AES Engine Ready + "BAT_LOW", // 71: Battery Voltage Below Threshold +}; + +const char * const vtab_atmega161[vts_atmega161] = { // ATmega161 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "INT2", // 3: External Interrupt 2 + "TIMER2_COMP", // 4: Timer 2 Compare Match + "TIMER2_OVF", // 5: Timer 2 Overflow + "TIMER1_CAPT", // 6: Timer 1 Capture Event + "TIMER1_COMPA", // 7: Timer 1 Compare Match A + "TIMER1_COMPB", // 8: Timer 1 Compare Match B + "TIMER1_OVF", // 9: Timer 1 Overflow + "TIMER0_COMP", // 10: Timer 0 Compare Match + "TIMER0_OVF", // 11: Timer 0 Overflow + "SPI_STC", // 12: SPI Serial Transfer Complete + "UART0_RX", // 13: UART 0 Receive Complete + "UART1_RX", // 14: UART 1 Receive Complete + "UART0_UDRE", // 15: UART 0 Data Register Empty + "UART1_UDRE", // 16: UART 1 Data Register Empty + "UART0_TX", // 17: UART 0 Transmit Complete + "UART1_TX", // 18: UART 1 Transmit Complete + "EE_RDY", // 19: EEPROM Ready + "ANA_COMP", // 20: Analog Comparator +}; + +const char * const vtab_atmega162[vts_atmega162] = { // ATmega162 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "INT2", // 3: External Interrupt 2 + "PCINT0", // 4: Pin Change Interrupt 0 + "PCINT1", // 5: Pin Change Interrupt 1 + "TIMER3_CAPT", // 6: Timer 3 Capture Event + "TIMER3_COMPA", // 7: Timer 3 Compare Match A + "TIMER3_COMPB", // 8: Timer 3 Compare Match B + "TIMER3_OVF", // 9: Timer 3 Overflow + "TIMER2_COMP", // 10: Timer 2 Compare Match + "TIMER2_OVF", // 11: Timer 2 Overflow + "TIMER1_CAPT", // 12: Timer 1 Capture Event + "TIMER1_COMPA", // 13: Timer 1 Compare Match A + "TIMER1_COMPB", // 14: Timer 1 Compare Match B + "TIMER1_OVF", // 15: Timer 1 Overflow + "TIMER0_COMP", // 16: Timer 0 Compare Match + "TIMER0_OVF", // 17: Timer 0 Overflow + "SPI_STC", // 18: SPI Serial Transfer Complete + "USART0_RXC", // 19: USART 0 Receive Complete + "USART1_RXC", // 20: USART 1 Receive Complete + "USART0_UDRE", // 21: USART 0 Data Register Empty + "USART1_UDRE", // 22: USART 1 Data Register Empty + "USART0_TXC", // 23: USART 0 Transmit Complete + "USART1_TXC", // 24: USART 1 Transmit Complete + "EE_RDY", // 25: EEPROM Ready + "ANA_COMP", // 26: Analog Comparator + "SPM_RDY", // 27: Store Program Memory Ready +}; + +const char * const vtab_atmega163[vts_atmega163] = { // ATmega163 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "TIMER2_COMP", // 3: Timer 2 Compare Match + "TIMER2_OVF", // 4: Timer 2 Overflow + "TIMER1_CAPT", // 5: Timer 1 Capture Event + "TIMER1_COMPA", // 6: Timer 1 Compare Match A + "TIMER1_COMPB", // 7: Timer 1 Compare Match B + "TIMER1_OVF", // 8: Timer 1 Overflow + "TIMER0_OVF", // 9: Timer 0 Overflow + "SPI_STC", // 10: SPI Serial Transfer Complete + "UART_RX", // 11: UART Receive Complete + "UART_UDRE", // 12: UART Data Register Empty + "UART_TX", // 13: UART Transmit Complete + "ADC", // 14: ADC Conversion Complete + "EE_RDY", // 15: EEPROM Ready + "ANA_COMP", // 16: Analog Comparator + "TWI", // 17: 2-Wire Interface +}; + +const char * const vtab_atmega168pb[vts_atmega168pb] = { // ATmega168PB, ATmega88PB, ATmega48PB + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "PCINT0", // 3: Pin Change Interrupt 0 + "PCINT1", // 4: Pin Change Interrupt 1 + "PCINT2", // 5: Pin Change Interrupt 2 + "WDT", // 6: Watchdog Time-out + "TIMER2_COMPA", // 7: Timer 2 Compare Match A + "TIMER2_COMPB", // 8: Timer 2 Compare Match B + "TIMER2_OVF", // 9: Timer 2 Overflow + "TIMER1_CAPT", // 10: Timer 1 Capture Event + "TIMER1_COMPA", // 11: Timer 1 Compare Match A + "TIMER1_COMPB", // 12: Timer 1 Compare Match B + "TIMER1_OVF", // 13: Timer 1 Overflow + "TIMER0_COMPA", // 14: Timer 0 Compare Match A + "TIMER0_COMPB", // 15: Timer 0 Compare Match B + "TIMER0_OVF", // 16: Timer 0 Overflow + "SPI_STC", // 17: SPI Serial Transfer Complete + "USART_RX", // 18: USART Receive Complete + "USART_UDRE", // 19: USART Data Register Empty + "USART_TX", // 20: USART Transmit Complete + "ADC", // 21: ADC Conversion Complete + "EE_READY", // 22: EEPROM Ready + "ANALOG_COMP", // 23: Analog Comparator + "TWI", // 24: 2-Wire Interface + "SPM_Ready", // 25: Store Program Memory Ready + "USART_START", // 26: USART Start +}; + +const char * const vtab_atmega323[vts_atmega323] = { // ATmega323, ATmega32A, ATmega32 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "INT2", // 3: External Interrupt 2 + "TIMER2_COMP", // 4: Timer 2 Compare Match + "TIMER2_OVF", // 5: Timer 2 Overflow + "TIMER1_CAPT", // 6: Timer 1 Capture Event + "TIMER1_COMPA", // 7: Timer 1 Compare Match A + "TIMER1_COMPB", // 8: Timer 1 Compare Match B + "TIMER1_OVF", // 9: Timer 1 Overflow + "TIMER0_COMP", // 10: Timer 0 Compare Match + "TIMER0_OVF", // 11: Timer 0 Overflow + "SPI_STC", // 12: SPI Serial Transfer Complete + "USART_RXC", // 13: USART Receive Complete + "USART_UDRE", // 14: USART Data Register Empty + "USART_TXC", // 15: USART Transmit Complete + "ADC", // 16: ADC Conversion Complete + "EE_RDY", // 17: EEPROM Ready + "ANA_COMP", // 18: Analog Comparator + "TWI", // 19: 2-Wire Interface + "SPM_RDY", // 20: Store Program Memory Ready +}; + +const char * const vtab_atmega324pb[vts_atmega324pb] = { // ATmega324PB + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "INT2", // 3: External Interrupt 2 + "PCINT0", // 4: Pin Change Interrupt 0 + "PCINT1", // 5: Pin Change Interrupt 1 + "PCINT2", // 6: Pin Change Interrupt 2 + "PCINT3", // 7: Pin Change Interrupt 3 + "WDT", // 8: Watchdog Time-out + "TIMER2_COMPA", // 9: Timer 2 Compare Match A + "TIMER2_COMPB", // 10: Timer 2 Compare Match B + "TIMER2_OVF", // 11: Timer 2 Overflow + "TIMER1_CAPT", // 12: Timer 1 Capture Event + "TIMER1_COMPA", // 13: Timer 1 Compare Match A + "TIMER1_COMPB", // 14: Timer 1 Compare Match B + "TIMER1_OVF", // 15: Timer 1 Overflow + "TIMER0_COMPA", // 16: Timer 0 Compare Match A + "TIMER0_COMPB", // 17: Timer 0 Compare Match B + "TIMER0_OVF", // 18: Timer 0 Overflow + "SPI0_STC", // 19: SPI 0 Serial Transfer Complete + "USART0_RX", // 20: USART 0 Receive Complete + "USART0_UDRE", // 21: USART 0 Data Register Empty + "USART0_TX", // 22: USART 0 Transmit Complete + "ANALOG_COMP", // 23: Analog Comparator + "ADC", // 24: ADC Conversion Complete + "EE_READY", // 25: EEPROM Ready + "TWI0", // 26: 2-Wire Interface 0 + "SPM_READY", // 27: Store Program Memory Ready + "USART1_RX", // 28: USART 1 Receive Complete + "USART1_UDRE", // 29: USART 1 Data Register Empty + "USART1_TX", // 30: USART 1 Transmit Complete + "TIMER3_CAPT", // 31: Timer 3 Capture Event + "TIMER3_COMPA", // 32: Timer 3 Compare Match A + "TIMER3_COMPB", // 33: Timer 3 Compare Match B + "TIMER3_OVF", // 34: Timer 3 Overflow + "USART0_START", // 35: USART 0 Receive Start + "USART1_START", // 36: USART 1 Receive Start + "PCINT4", // 37: Pin Change Interrupt 4 + "XOSCFD", // 38: Crystal Failure Detect + "PTC_EOC", // 39: PTC End of Conversion + "PTC_WCOMP", // 40: PTC Window Comparator Mode + "SPI1_STC", // 41: SPI 1 Serial Transfer Complete + "TWI1", // 42: 2-Wire Interface 1 + "TIMER4_CAPT", // 43: Timer 4 Capture Event + "TIMER4_COMPA", // 44: Timer 4 Compare Match A + "TIMER4_COMPB", // 45: Timer 4 Compare Match B + "TIMER4_OVF", // 46: Timer 4 Overflow + "USART2_RX", // 47: USART 2 Receive Complete + "USART2_UDRE", // 48: USART 2 Data Register Empty + "USART2_TX", // 49: USART 2 Transmit Complete + "USART2_START", // 50: USART 2 Receive Start +}; + +const char * const vtab_atmega328[vts_atmega328] = { // ATmega328, ATmega168 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "PCINT0", // 3: Pin Change Interrupt 0 + "PCINT1", // 4: Pin Change Interrupt 1 + "PCINT2", // 5: Pin Change Interrupt 2 + "WDT", // 6: Watchdog Time-out + "TIMER2_COMPA", // 7: Timer 2 Compare Match A + "TIMER2_COMPB", // 8: Timer 2 Compare Match B + "TIMER2_OVF", // 9: Timer 2 Overflow + "TIMER1_CAPT", // 10: Timer 1 Capture Event + "TIMER1_COMPA", // 11: Timer 1 Compare Match A + "TIMER1_COMPB", // 12: Timer 1 Compare Match B + "TIMER1_OVF", // 13: Timer 1 Overflow + "TIMER0_COMPA", // 14: Timer 0 Compare Match A + "TIMER0_COMPB", // 15: Timer 0 Compare Match B + "TIMER0_OVF", // 16: Timer 0 Overflow + "SPI_STC", // 17: SPI Serial Transfer Complete + "USART_RX", // 18: USART Receive Complete + "USART_UDRE", // 19: USART Data Register Empty + "USART_TX", // 20: USART Transmit Complete + "ADC", // 21: ADC Conversion Complete + "EE_READY", // 22: EEPROM Ready + "ANALOG_COMP", // 23: Analog Comparator + "TWI", // 24: 2-Wire Interface + "SPM_READY", // 25: Store Program Memory Ready +}; + +const char * const vtab_atmega328p[vts_atmega328p] = { // ATmega328P, ATmega168PA, ATmega168P, ATmega168A, ATmega88PA, ATmega88P, ATmega88A, ATmega88, ATmega48PA, ATmega48P, ATmega48A, ATmega48, ATA6614Q, ATA6613C, ATA6612C + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "PCINT0", // 3: Pin Change Interrupt 0 + "PCINT1", // 4: Pin Change Interrupt 1 + "PCINT2", // 5: Pin Change Interrupt 2 + "WDT", // 6: Watchdog Time-out + "TIMER2_COMPA", // 7: Timer 2 Compare Match A + "TIMER2_COMPB", // 8: Timer 2 Compare Match B + "TIMER2_OVF", // 9: Timer 2 Overflow + "TIMER1_CAPT", // 10: Timer 1 Capture Event + "TIMER1_COMPA", // 11: Timer 1 Compare Match A + "TIMER1_COMPB", // 12: Timer 1 Compare Match B + "TIMER1_OVF", // 13: Timer 1 Overflow + "TIMER0_COMPA", // 14: Timer 0 Compare Match A + "TIMER0_COMPB", // 15: Timer 0 Compare Match B + "TIMER0_OVF", // 16: Timer 0 Overflow + "SPI_STC", // 17: SPI Serial Transfer Complete + "USART_RX", // 18: USART Receive Complete + "USART_UDRE", // 19: USART Data Register Empty + "USART_TX", // 20: USART Transmit Complete + "ADC", // 21: ADC Conversion Complete + "EE_READY", // 22: EEPROM Ready + "ANALOG_COMP", // 23: Analog Comparator + "TWI", // 24: 2-Wire Interface + "SPM_Ready", // 25: Store Program Memory Ready +}; + +const char * const vtab_atmega328pb[vts_atmega328pb] = { // ATmega328PB + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "PCINT0", // 3: Pin Change Interrupt 0 + "PCINT1", // 4: Pin Change Interrupt 1 + "PCINT2", // 5: Pin Change Interrupt 2 + "WDT", // 6: Watchdog Time-out + "TIMER2_COMPA", // 7: Timer 2 Compare Match A + "TIMER2_COMPB", // 8: Timer 2 Compare Match B + "TIMER2_OVF", // 9: Timer 2 Overflow + "TIMER1_CAPT", // 10: Timer 1 Capture Event + "TIMER1_COMPA", // 11: Timer 1 Compare Match A + "TIMER1_COMPB", // 12: Timer 1 Compare Match B + "TIMER1_OVF", // 13: Timer 1 Overflow + "TIMER0_COMPA", // 14: Timer 0 Compare Match A + "TIMER0_COMPB", // 15: Timer 0 Compare Match B + "TIMER0_OVF", // 16: Timer 0 Overflow + "SPI0_STC", // 17: SPI 0 Serial Transfer Complete + "USART0_RX", // 18: USART 0 Receive Complete + "USART0_UDRE", // 19: USART 0 Data Register Empty + "USART0_TX", // 20: USART 0 Transmit Complete + "ADC", // 21: ADC Conversion Complete + "EE_READY", // 22: EEPROM Ready + "ANALOG_COMP", // 23: Analog Comparator + "TWI0", // 24: 2-Wire Interface 0 + "SPM_Ready", // 25: Store Program Memory Ready + "USART0_START", // 26: USART 0 Receive Start + "PCINT3", // 27: Pin Change Interrupt 3 + "USART1_RX", // 28: USART 1 Receive Complete + "USART1_UDRE", // 29: USART 1 Data Register Empty + "USART1_TX", // 30: USART 1 Transmit Complete + "USART1_START", // 31: USART 1 Receive Start + "TIMER3_CAPT", // 32: Timer 3 Capture Event + "TIMER3_COMPA", // 33: Timer 3 Compare Match A + "TIMER3_COMPB", // 34: Timer 3 Compare Match B + "TIMER3_OVF", // 35: Timer 3 Overflow + "CFD", // 36: Clock Failure Detection + "PTC_EOC", // 37: PTC End of Conversion + "PTC_WCOMP", // 38: PTC Window Comparator Mode + "SPI1_STC", // 39: SPI 1 Serial Transfer Complete + "TWI1", // 40: 2-Wire Interface 1 + "TIMER4_CAPT", // 41: Timer 4 Capture Event + "TIMER4_COMPA", // 42: Timer 4 Compare Match A + "TIMER4_COMPB", // 43: Timer 4 Compare Match B + "TIMER4_OVF", // 44: Timer 4 Overflow +}; + +const char * const vtab_atmega406[vts_atmega406] = { // ATmega406 + "RESET", // 0: Reset (various reasons) + "BPINT", // 1: Battery Protection Interrupt + "INT0", // 2: External Interrupt 0 + "INT1", // 3: External Interrupt 1 + "INT2", // 4: External Interrupt 2 + "INT3", // 5: External Interrupt 3 + "PCINT0", // 6: Pin Change Interrupt 0 + "PCINT1", // 7: Pin Change Interrupt 1 + "WDT", // 8: Watchdog Time-out + "WAKE_UP", // 9: Wake Up + "TIM1_COMP", // 10: Timer 1 Compare and Match + "TIM1_OVF", // 11: Timer 1 Overflow + "TIM0_COMPA", // 12: Timer 0 Compare Match A + "TIM0_COMPB", // 13: Timer 0 Compare Match B + "TIM0_OVF", // 14: Timer 0 Overflow + "TWI_BUS_CD", // 15: 2-Wire Interface Bus Connect/Disconnect + "TWI", // 16: 2-Wire Interface + "VADC", // 17: Voltage ADC Conversion Complete + "CCADC_CONV", // 18: Coulomb Counter ADC Conversion Complete + "CCADC_REG_CUR", // 19: Coloumb Counter ADC Regular Current + "CCADC_ACC", // 20: Coloumb Counter ADC Accumulator + "EE_READY", // 21: EEPROM Ready + "SPM_READY", // 22: Store Program Memory Ready +}; + +const char * const vtab_atmega644[vts_atmega644] = { // ATmega644 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "INT2", // 3: External Interrupt 2 + "PCINT0", // 4: Pin Change Interrupt 0 + "PCINT1", // 5: Pin Change Interrupt 1 + "PCINT2", // 6: Pin Change Interrupt 2 + "PCINT3", // 7: Pin Change Interrupt 3 + "WDT", // 8: Watchdog Time-out + "TIMER2_COMPA", // 9: Timer 2 Compare Match A + "TIMER2_COMPB", // 10: Timer 2 Compare Match B + "TIMER2_OVF", // 11: Timer 2 Overflow + "TIMER1_CAPT", // 12: Timer 1 Capture Event + "TIMER1_COMPA", // 13: Timer 1 Compare Match A + "TIMER1_COMPB", // 14: Timer 1 Compare Match B + "TIMER1_OVF", // 15: Timer 1 Overflow + "TIMER0_COMPA", // 16: Timer 0 Compare Match A + "TIMER0_COMPB", // 17: Timer 0 Compare Match B + "TIMER0_OVF", // 18: Timer 0 Overflow + "SPI_STC", // 19: SPI Serial Transfer Complete + "USART0_RX", // 20: USART 0 Receive Complete + "USART0_UDRE", // 21: USART 0 Data Register Empty + "USART0_TX", // 22: USART 0 Transmit Complete + "ANALOG_COMP", // 23: Analog Comparator + "ADC", // 24: ADC Conversion Complete + "EE_READY", // 25: EEPROM Ready + "TWI", // 26: 2-Wire Interface + "SPM_READY", // 27: Store Program Memory Ready +}; + +const char * const vtab_atmega644pa[vts_atmega644pa] = { // ATmega644PA, ATmega644P, ATmega644A, ATmega324PA, ATmega324P, ATmega324A, ATmega164PA, ATmega164P, ATmega164A + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "INT2", // 3: External Interrupt 2 + "PCINT0", // 4: Pin Change Interrupt 0 + "PCINT1", // 5: Pin Change Interrupt 1 + "PCINT2", // 6: Pin Change Interrupt 2 + "PCINT3", // 7: Pin Change Interrupt 3 + "WDT", // 8: Watchdog Time-out + "TIMER2_COMPA", // 9: Timer 2 Compare Match A + "TIMER2_COMPB", // 10: Timer 2 Compare Match B + "TIMER2_OVF", // 11: Timer 2 Overflow + "TIMER1_CAPT", // 12: Timer 1 Capture Event + "TIMER1_COMPA", // 13: Timer 1 Compare Match A + "TIMER1_COMPB", // 14: Timer 1 Compare Match B + "TIMER1_OVF", // 15: Timer 1 Overflow + "TIMER0_COMPA", // 16: Timer 0 Compare Match A + "TIMER0_COMPB", // 17: Timer 0 Compare Match B + "TIMER0_OVF", // 18: Timer 0 Overflow + "SPI_STC", // 19: SPI Serial Transfer Complete + "USART0_RX", // 20: USART 0 Receive Complete + "USART0_UDRE", // 21: USART 0 Data Register Empty + "USART0_TX", // 22: USART 0 Transmit Complete + "ANALOG_COMP", // 23: Analog Comparator + "ADC", // 24: ADC Conversion Complete + "EE_READY", // 25: EEPROM Ready + "TWI", // 26: 2-Wire Interface + "SPM_READY", // 27: Store Program Memory Ready + "USART1_RX", // 28: USART 1 Receive Complete + "USART1_UDRE", // 29: USART 1 Data Register Empty + "USART1_TX", // 30: USART 1 Transmit Complete +}; + +const char * const vtab_atmega645p[vts_atmega645p] = { // ATmega645P, ATmega645A, ATmega645, ATmega325PA, ATmega325P, ATmega325A, ATmega325, ATmega165PA, ATmega165P, ATmega165A, ATmega165 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "PCINT0", // 2: Pin Change Interrupt 0 + "PCINT1", // 3: Pin Change Interrupt 1 + "TIMER2_COMP", // 4: Timer 2 Compare Match + "TIMER2_OVF", // 5: Timer 2 Overflow + "TIMER1_CAPT", // 6: Timer 1 Capture Event + "TIMER1_COMPA", // 7: Timer 1 Compare Match A + "TIMER1_COMPB", // 8: Timer 1 Compare Match B + "TIMER1_OVF", // 9: Timer 1 Overflow + "TIMER0_COMP", // 10: Timer 0 Compare Match + "TIMER0_OVF", // 11: Timer 0 Overflow + "SPI_STC", // 12: SPI Serial Transfer Complete + "USART0_RX", // 13: USART 0 Receive Complete + "USART0_UDRE", // 14: USART 0 Data Register Empty + "USART0_TX", // 15: USART 0 Transmit Complete + "USI_START", // 16: USI Start Condition + "USI_OVERFLOW", // 17: USI Overflow + "ANALOG_COMP", // 18: Analog Comparator + "ADC", // 19: ADC Conversion Complete + "EE_READY", // 20: EEPROM Ready + "SPM_READY", // 21: Store Program Memory Ready +}; + +const char * const vtab_atmega649p[vts_atmega649p] = { // ATmega649P, ATmega649A, ATmega649, ATmega329PA, ATmega329P, ATmega329A, ATmega329, ATmega169PA, ATmega169P, ATmega169A, ATmega169 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "PCINT0", // 2: Pin Change Interrupt 0 + "PCINT1", // 3: Pin Change Interrupt 1 + "TIMER2_COMP", // 4: Timer 2 Compare Match + "TIMER2_OVF", // 5: Timer 2 Overflow + "TIMER1_CAPT", // 6: Timer 1 Capture Event + "TIMER1_COMPA", // 7: Timer 1 Compare Match A + "TIMER1_COMPB", // 8: Timer 1 Compare Match B + "TIMER1_OVF", // 9: Timer 1 Overflow + "TIMER0_COMP", // 10: Timer 0 Compare Match + "TIMER0_OVF", // 11: Timer 0 Overflow + "SPI_STC", // 12: SPI Serial Transfer Complete + "USART0_RX", // 13: USART 0 Receive Complete + "USART0_UDRE", // 14: USART 0 Data Register Empty + "USART0_TX", // 15: USART 0 Transmit Complete + "USI_START", // 16: USI Start Condition + "USI_OVERFLOW", // 17: USI Overflow + "ANALOG_COMP", // 18: Analog Comparator + "ADC", // 19: ADC Conversion Complete + "EE_READY", // 20: EEPROM Ready + "SPM_READY", // 21: Store Program Memory Ready + "LCD", // 22: LCD Start of Frame +}; + +const char * const vtab_atmega1284p[vts_atmega1284p] = { // ATmega1284P, ATmega1284 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "INT2", // 3: External Interrupt 2 + "PCINT0", // 4: Pin Change Interrupt 0 + "PCINT1", // 5: Pin Change Interrupt 1 + "PCINT2", // 6: Pin Change Interrupt 2 + "PCINT3", // 7: Pin Change Interrupt 3 + "WDT", // 8: Watchdog Time-out + "TIMER2_COMPA", // 9: Timer 2 Compare Match A + "TIMER2_COMPB", // 10: Timer 2 Compare Match B + "TIMER2_OVF", // 11: Timer 2 Overflow + "TIMER1_CAPT", // 12: Timer 1 Capture Event + "TIMER1_COMPA", // 13: Timer 1 Compare Match A + "TIMER1_COMPB", // 14: Timer 1 Compare Match B + "TIMER1_OVF", // 15: Timer 1 Overflow + "TIMER0_COMPA", // 16: Timer 0 Compare Match A + "TIMER0_COMPB", // 17: Timer 0 Compare Match B + "TIMER0_OVF", // 18: Timer 0 Overflow + "SPI_STC", // 19: SPI Serial Transfer Complete + "USART0_RX", // 20: USART 0 Receive Complete + "USART0_UDRE", // 21: USART 0 Data Register Empty + "USART0_TX", // 22: USART 0 Transmit Complete + "ANALOG_COMP", // 23: Analog Comparator + "ADC", // 24: ADC Conversion Complete + "EE_READY", // 25: EEPROM Ready + "TWI", // 26: 2-Wire Interface + "SPM_READY", // 27: Store Program Memory Ready + "USART1_RX", // 28: USART 1 Receive Complete + "USART1_UDRE", // 29: USART 1 Data Register Empty + "USART1_TX", // 30: USART 1 Transmit Complete + "TIMER3_CAPT", // 31: Timer 3 Capture Event + "TIMER3_COMPA", // 32: Timer 3 Compare Match A + "TIMER3_COMPB", // 33: Timer 3 Compare Match B + "TIMER3_OVF", // 34: Timer 3 Overflow +}; + +const char * const vtab_atmega2561[vts_atmega2561] = { // ATmega2561, ATmega2560, ATmega1281, ATmega1280, ATmega640 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "INT2", // 3: External Interrupt 2 + "INT3", // 4: External Interrupt 3 + "INT4", // 5: External Interrupt 4 + "INT5", // 6: External Interrupt 5 + "INT6", // 7: External Interrupt 6 + "INT7", // 8: External Interrupt 7 + "PCINT0", // 9: Pin Change Interrupt 0 + "PCINT1", // 10: Pin Change Interrupt 1 + "PCINT2", // 11: Pin Change Interrupt 2 + "WDT", // 12: Watchdog Time-out + "TIMER2_COMPA", // 13: Timer 2 Compare Match A + "TIMER2_COMPB", // 14: Timer 2 Compare Match B + "TIMER2_OVF", // 15: Timer 2 Overflow + "TIMER1_CAPT", // 16: Timer 1 Capture Event + "TIMER1_COMPA", // 17: Timer 1 Compare Match A + "TIMER1_COMPB", // 18: Timer 1 Compare Match B + "TIMER1_COMPC", // 19: Timer 1 Compare Match C + "TIMER1_OVF", // 20: Timer 1 Overflow + "TIMER0_COMPA", // 21: Timer 0 Compare Match A + "TIMER0_COMPB", // 22: Timer 0 Compare Match B + "TIMER0_OVF", // 23: Timer 0 Overflow + "SPI_STC", // 24: SPI Serial Transfer Complete + "USART0_RX", // 25: USART 0 Receive Complete + "USART0_UDRE", // 26: USART 0 Data Register Empty + "USART0_TX", // 27: USART 0 Transmit Complete + "ANALOG_COMP", // 28: Analog Comparator + "ADC", // 29: ADC Conversion Complete + "EE_READY", // 30: EEPROM Ready + "TIMER3_CAPT", // 31: Timer 3 Capture Event + "TIMER3_COMPA", // 32: Timer 3 Compare Match A + "TIMER3_COMPB", // 33: Timer 3 Compare Match B + "TIMER3_COMPC", // 34: Timer 3 Compare Match C + "TIMER3_OVF", // 35: Timer 3 Overflow + "USART1_RX", // 36: USART 1 Receive Complete + "USART1_UDRE", // 37: USART 1 Data Register Empty + "USART1_TX", // 38: USART 1 Transmit Complete + "TWI", // 39: 2-Wire Interface + "SPM_READY", // 40: Store Program Memory Ready + "TIMER4_CAPT", // 41: Timer 4 Capture Event + "TIMER4_COMPA", // 42: Timer 4 Compare Match A + "TIMER4_COMPB", // 43: Timer 4 Compare Match B + "TIMER4_COMPC", // 44: Timer 4 Compare Match C + "TIMER4_OVF", // 45: Timer 4 Overflow + "TIMER5_CAPT", // 46: Timer 5 Capture Event + "TIMER5_COMPA", // 47: Timer 5 Compare Match A + "TIMER5_COMPB", // 48: Timer 5 Compare Match B + "TIMER5_COMPC", // 49: Timer 5 Compare Match C + "TIMER5_OVF", // 50: Timer 5 Overflow + "USART2_RX", // 51: USART 2 Receive Complete + "USART2_UDRE", // 52: USART 2 Data Register Empty + "USART2_TX", // 53: USART 2 Transmit Complete + "USART3_RX", // 54: USART 3 Receive Complete + "USART3_UDRE", // 55: USART 3 Data Register Empty + "USART3_TX", // 56: USART 3 Transmit Complete +}; + +const char * const vtab_atmega2564rfr2[vts_atmega2564rfr2] = { // ATmega2564RFR2, ATmega1284RFR2, ATmega644RFR2, ATmega256RFR2, ATmega128RFR2, ATmega64RFR2 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "INT2", // 3: External Interrupt 2 + "INT3", // 4: External Interrupt 3 + "INT4", // 5: External Interrupt 4 + "INT5", // 6: External Interrupt 5 + "INT6", // 7: External Interrupt 6 + "INT7", // 8: External Interrupt 7 + "PCINT0", // 9: Pin Change Interrupt 0 + "PCINT1", // 10: Pin Change Interrupt 1 + "PCINT2", // 11: Pin Change Interrupt 2 + "WDT", // 12: Watchdog Time-out + "TIMER2_COMPA", // 13: Timer 2 Compare Match A + "TIMER2_COMPB", // 14: Timer 2 Compare Match B + "TIMER2_OVF", // 15: Timer 2 Overflow + "TIMER1_CAPT", // 16: Timer 1 Capture Event + "TIMER1_COMPA", // 17: Timer 1 Compare Match A + "TIMER1_COMPB", // 18: Timer 1 Compare Match B + "TIMER1_COMPC", // 19: Timer 1 Compare Match C + "TIMER1_OVF", // 20: Timer 1 Overflow + "TIMER0_COMPA", // 21: Timer 0 Compare Match A + "TIMER0_COMPB", // 22: Timer 0 Compare Match B + "TIMER0_OVF", // 23: Timer 0 Overflow + "SPI_STC", // 24: SPI Serial Transfer Complete + "USART0_RX", // 25: USART 0 Receive Complete + "USART0_UDRE", // 26: USART 0 Data Register Empty + "USART0_TX", // 27: USART 0 Transmit Complete + "ANALOG_COMP", // 28: Analog Comparator + "ADC", // 29: ADC Conversion Complete + "EE_READY", // 30: EEPROM Ready + "TIMER3_CAPT", // 31: Timer 3 Capture Event + "TIMER3_COMPA", // 32: Timer 3 Compare Match A + "TIMER3_COMPB", // 33: Timer 3 Compare Match B + "TIMER3_COMPC", // 34: Timer 3 Compare Match C + "TIMER3_OVF", // 35: Timer 3 Overflow + "USART1_RX", // 36: USART 1 Receive Complete + "USART1_UDRE", // 37: USART 1 Data Register Empty + "USART1_TX", // 38: USART 1 Transmit Complete + "TWI", // 39: 2-Wire Interface + "SPM_READY", // 40: Store Program Memory Ready + "TIMER4_CAPT", // 41: Timer 4 Capture Event + "TIMER4_COMPA", // 42: Timer 4 Compare Match A + "TIMER4_COMPB", // 43: Timer 4 Compare Match B + "TIMER4_COMPC", // 44: Timer 4 Compare Match C + "TIMER4_OVF", // 45: Timer 4 Overflow + "TIMER5_CAPT", // 46: Timer 5 Capture Event + "TIMER5_COMPA", // 47: Timer 5 Compare Match A + "TIMER5_COMPB", // 48: Timer 5 Compare Match B + "TIMER5_COMPC", // 49: Timer 5 Compare Match C + "TIMER5_OVF", // 50: Timer 5 Overflow + "RESERVED_51", // 51: Reserved 51 + "RESERVED_52", // 52: Reserved 52 + "RESERVED_53", // 53: Reserved 53 + "RESERVED_54", // 54: Reserved 54 + "RESERVED_55", // 55: Reserved 55 + "RESERVED_56", // 56: Reserved 56 + "TRX24_PLL_LOCK", // 57: TRX24 PLL Lock + "TRX24_PLL_UNLOCK", // 58: TRX24 PLL Unlock + "TRX24_RX_START", // 59: TRX24 Receive Start + "TRX24_RX_END", // 60: TRX24 Receive End + "TRX24_CCA_ED_DONE", // 61: TRX24 CCA/ED Done + "TRX24_XAH_AMI", // 62: TRX24 XAH/AMI + "TRX24_TX_END", // 63: TRX24 Transmit End + "TRX24_AWAKE", // 64: TRX24 AWAKE - Transceiver is Reaching State TRX_OFF + "SCNT_CMP1", // 65: Symbol Counter - Compare Match 1 Interrupt + "SCNT_CMP2", // 66: Symbol Counter - Compare Match 2 Interrupt + "SCNT_CMP3", // 67: Symbol Counter - Compare Match 3 Interrupt + "SCNT_OVFL", // 68: Symbol Counter - Overflow Interrupt + "SCNT_BACKOFF", // 69: Symbol Counter - Backoff Interrupt + "AES_READY", // 70: AES Engine Ready + "BAT_LOW", // 71: Battery Voltage Below Threshold + "TRX24_TX_START", // 72: TRX24 Transmit Start + "TRX24_AMI0", // 73: TRX24 Address Match 0 + "TRX24_AMI1", // 74: TRX24 Address Match 1 + "TRX24_AMI2", // 75: TRX24 Address Match 2 + "TRX24_AMI3", // 76: TRX24 Address Match 3 +}; + +const char * const vtab_atmega6450p[vts_atmega6450p] = { // ATmega6450P, ATmega6450A, ATmega6450, ATmega3250PA, ATmega3250P, ATmega3250A, ATmega3250 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "PCINT0", // 2: Pin Change Interrupt 0 + "PCINT1", // 3: Pin Change Interrupt 1 + "TIMER2_COMP", // 4: Timer 2 Compare Match + "TIMER2_OVF", // 5: Timer 2 Overflow + "TIMER1_CAPT", // 6: Timer 1 Capture Event + "TIMER1_COMPA", // 7: Timer 1 Compare Match A + "TIMER1_COMPB", // 8: Timer 1 Compare Match B + "TIMER1_OVF", // 9: Timer 1 Overflow + "TIMER0_COMP", // 10: Timer 0 Compare Match + "TIMER0_OVF", // 11: Timer 0 Overflow + "SPI_STC", // 12: SPI Serial Transfer Complete + "USART_RX", // 13: USART Receive Complete + "USART_UDRE", // 14: USART Data Register Empty + "USART0_TX", // 15: USART 0 Transmit Complete + "USI_START", // 16: USI Start Condition + "USI_OVERFLOW", // 17: USI Overflow + "ANALOG_COMP", // 18: Analog Comparator + "ADC", // 19: ADC Conversion Complete + "EE_READY", // 20: EEPROM Ready + "SPM_READY", // 21: Store Program Memory Ready + "NOT_USED", // 22: Reserved + "PCINT2", // 23: Pin Change Interrupt 2 + "PCINT3", // 24: Pin Change Interrupt 3 +}; + +const char * const vtab_atmega6490p[vts_atmega6490p] = { // ATmega6490P, ATmega6490A, ATmega6490, ATmega3290PA, ATmega3290P, ATmega3290A, ATmega3290 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "PCINT0", // 2: Pin Change Interrupt 0 + "PCINT1", // 3: Pin Change Interrupt 1 + "TIMER2_COMP", // 4: Timer 2 Compare Match + "TIMER2_OVF", // 5: Timer 2 Overflow + "TIMER1_CAPT", // 6: Timer 1 Capture Event + "TIMER1_COMPA", // 7: Timer 1 Compare Match A + "TIMER1_COMPB", // 8: Timer 1 Compare Match B + "TIMER1_OVF", // 9: Timer 1 Overflow + "TIMER0_COMP", // 10: Timer 0 Compare Match + "TIMER0_OVF", // 11: Timer 0 Overflow + "SPI_STC", // 12: SPI Serial Transfer Complete + "USART_RX", // 13: USART Receive Complete + "USART_UDRE", // 14: USART Data Register Empty + "USART0_TX", // 15: USART 0 Transmit Complete + "USI_START", // 16: USI Start Condition + "USI_OVERFLOW", // 17: USI Overflow + "ANALOG_COMP", // 18: Analog Comparator + "ADC", // 19: ADC Conversion Complete + "EE_READY", // 20: EEPROM Ready + "SPM_READY", // 21: Store Program Memory Ready + "LCD", // 22: LCD Start of Frame + "PCINT2", // 23: Pin Change Interrupt 2 + "PCINT3", // 24: Pin Change Interrupt 3 +}; + +const char * const vtab_atmega8515[vts_atmega8515] = { // ATmega8515 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "TIMER1_CAPT", // 3: Timer 1 Capture Event + "TIMER1_COMPA", // 4: Timer 1 Compare Match A + "TIMER1_COMPB", // 5: Timer 1 Compare Match B + "TIMER1_OVF", // 6: Timer 1 Overflow + "TIMER0_OVF", // 7: Timer 0 Overflow + "SPI_STC", // 8: SPI Serial Transfer Complete + "USART_RX", // 9: USART Receive Complete + "USART_UDRE", // 10: USART Data Register Empty + "USART_TX", // 11: USART Transmit Complete + "ANA_COMP", // 12: Analog Comparator + "INT2", // 13: External Interrupt 2 + "TIMER0_COMP", // 14: Timer 0 Compare Match + "EE_RDY", // 15: EEPROM Ready + "SPM_RDY", // 16: Store Program Memory Ready +}; + +const char * const vtab_atmega8535[vts_atmega8535] = { // ATmega8535 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "TIMER2_COMP", // 3: Timer 2 Compare Match + "TIMER2_OVF", // 4: Timer 2 Overflow + "TIMER1_CAPT", // 5: Timer 1 Capture Event + "TIMER1_COMPA", // 6: Timer 1 Compare Match A + "TIMER1_COMPB", // 7: Timer 1 Compare Match B + "TIMER1_OVF", // 8: Timer 1 Overflow + "TIMER0_OVF", // 9: Timer 0 Overflow + "SPI_STC", // 10: SPI Serial Transfer Complete + "USART_RX", // 11: USART Receive Complete + "USART_UDRE", // 12: USART Data Register Empty + "USART_TX", // 13: USART Transmit Complete + "ADC", // 14: ADC Conversion Complete + "EE_RDY", // 15: EEPROM Ready + "ANA_COMP", // 16: Analog Comparator + "TWI", // 17: 2-Wire Interface + "INT2", // 18: External Interrupt 2 + "TIMER0_COMP", // 19: Timer 0 Compare Match + "SPM_RDY", // 20: Store Program Memory Ready +}; + +const char * const vtab_at86rf401[vts_at86rf401] = { // AT86RF401 + "RESET", // 0: Reset (various reasons) + "TXDONE", // 1: Transmit Complete + "TXEMPTY", // 2: Transmit Register Empty +}; + +const char * const vtab_at90pwm2[vts_at90pwm2] = { // AT90PWM2 + "RESET", // 0: Reset (various reasons) + "PSC2_CAPT", // 1: PSC 2 Capture Event + "PSC2_EC", // 2: PSC 2 End Cycle + "PSC1_CAPT", // 3: PSC 1 Capture Event + "PSC1_EC", // 4: PSC 1 End Cycle + "PSC0_CAPT", // 5: PSC 0 Capture Event + "PSC0_EC", // 6: PSC 0 End Cycle + "ANALOG_COMP_0", // 7: Analog Comparator 0 + "ANALOG_COMP_1", // 8: Analog Comparator 1 + "ANALOG_COMP_2", // 9: Analog Comparator 2 + "INT0", // 10: External Interrupt 0 + "TIMER1_CAPT", // 11: Timer 1 Capture Event + "TIMER1_COMPA", // 12: Timer 1 Compare Match A + "TIMER1_COMPB", // 13: Timer 1 Compare Match B + "UNUSED", // 14: not implemented on this device + "TIMER1_OVF", // 15: Timer 1 Overflow + "TIMER0_COMP_A", // 16: Timer 0 Compare Match A + "TIMER0_OVF", // 17: Timer 0 Overflow + "ADC", // 18: ADC Conversion Complete + "INT1", // 19: External Interrupt 1 + "SPI_STC", // 20: SPI Serial Transfer Complete + "USART_RX", // 21: USART Receive Complete + "USART_UDRE", // 22: USART Data Register Empty + "USART_TX", // 23: USART Transmit Complete + "INT2", // 24: External Interrupt 2 + "WDT", // 25: Watchdog Time-out + "EE_READY", // 26: EEPROM Ready + "TIMER0_COMPB", // 27: Timer 0 Compare Match B + "INT3", // 28: External Interrupt 3 + "UNUSED", // 29: not implemented on this device + "UNUSED", // 30: not implemented on this device + "SPM_READY", // 31: Store Program Memory Ready +}; + +const char * const vtab_at90pwm3b[vts_at90pwm3b] = { // AT90PWM3B, AT90PWM3, AT90PWM2B + "RESET", // 0: Reset (various reasons) + "PSC2_CAPT", // 1: PSC 2 Capture Event + "PSC2_EC", // 2: PSC 2 End Cycle + "PSC1_CAPT", // 3: PSC 1 Capture Event + "PSC1_EC", // 4: PSC 1 End Cycle + "PSC0_CAPT", // 5: PSC 0 Capture Event + "PSC0_EC", // 6: PSC 0 End Cycle + "ANALOG_COMP_0", // 7: Analog Comparator 0 + "ANALOG_COMP_1", // 8: Analog Comparator 1 + "ANALOG_COMP_2", // 9: Analog Comparator 2 + "INT0", // 10: External Interrupt 0 + "TIMER1_CAPT", // 11: Timer 1 Capture Event + "TIMER1_COMPA", // 12: Timer 1 Compare Match A + "TIMER1_COMPB", // 13: Timer 1 Compare Match B + "RESERVED15", // 14: Reserved 15 + "TIMER1_OVF", // 15: Timer 1 Overflow + "TIMER0_COMPA", // 16: Timer 0 Compare Match A + "TIMER0_OVF", // 17: Timer 0 Overflow + "ADC", // 18: ADC Conversion Complete + "INT1", // 19: External Interrupt 1 + "SPI_STC", // 20: SPI Serial Transfer Complete + "USART_RX", // 21: USART Receive Complete + "USART_UDRE", // 22: USART Data Register Empty + "USART_TX", // 23: USART Transmit Complete + "INT2", // 24: External Interrupt 2 + "WDT", // 25: Watchdog Time-out + "EE_READY", // 26: EEPROM Ready + "TIMER0_COMPB", // 27: Timer 0 Compare Match B + "INT3", // 28: External Interrupt 3 + "RESERVED30", // 29: Reserved 30 + "RESERVED31", // 30: Reserved 31 + "SPM_READY", // 31: Store Program Memory Ready +}; + +const char * const vtab_at90scr100[vts_at90scr100] = { // AT90SCR100 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "INT2", // 3: External Interrupt 2 + "INT3", // 4: External Interrupt 3 + "PCINT0", // 5: Pin Change Interrupt 0 + "PCINT1", // 6: Pin Change Interrupt 1 + "PCINT2", // 7: Pin Change Interrupt 2 + "WDT", // 8: Watchdog Time-out + "TIMER2_COMPA", // 9: Timer 2 Compare Match A + "TIMER2_COMPB", // 10: Timer 2 Compare Match B + "TIMER2_OVF", // 11: Timer 2 Overflow + "TIMER1_CAPT", // 12: Timer 1 Capture Event + "TIMER1_COMPA", // 13: Timer 1 Compare Match A + "TIMER1_COMPB", // 14: Timer 1 Compare Match B + "TIMER1_OVF", // 15: Timer 1 Overflow + "TIMER0_COMPA", // 16: Timer 0 Compare Match A + "TIMER0_COMPB", // 17: Timer 0 Compare Match B + "TIMER0_OVF", // 18: Timer 0 Overflow + "SPI_STC", // 19: SPI Serial Transfer Complete + "USART0_RX", // 20: USART 0 Receive Complete + "USART0_UDRE", // 21: USART 0 Data Register Empty + "USART0_TX", // 22: USART 0 Transmit Complete + "SUPPLY_MON", // 23: Supply Monitor + "RFU", // 24: Reserved for Future Use + "EE_READY", // 25: EEPROM Ready + "TWI", // 26: 2-Wire Interface + "SPM_READY", // 27: Store Program Memory Ready + "KEYBOARD", // 28: Keyboard Input Change + "AES_Operation", // 29: AES Operation + "HSSPI", // 30: High-Speed SPI + "USB_Endpoint", // 31: USB Endpoint + "USB_Protocol", // 32: USB Protocol + "SCIB", // 33: Smart Card Reader Interface + "USBHost_Control", // 34: USB Host Controller + "USBHost_Pipe", // 35: USB Host Pipe + "CPRES", // 36: Card Presence Detection + "PCINT3", // 37: Pin Change Interrupt 3 +}; + +const char * const vtab_at90can128[vts_at90can128] = { // AT90CAN128, AT90CAN64, AT90CAN32 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "INT2", // 3: External Interrupt 2 + "INT3", // 4: External Interrupt 3 + "INT4", // 5: External Interrupt 4 + "INT5", // 6: External Interrupt 5 + "INT6", // 7: External Interrupt 6 + "INT7", // 8: External Interrupt 7 + "TIMER2_COMP", // 9: Timer 2 Compare Match + "TIMER2_OVF", // 10: Timer 2 Overflow + "TIMER1_CAPT", // 11: Timer 1 Capture Event + "TIMER1_COMPA", // 12: Timer 1 Compare Match A + "TIMER1_COMPB", // 13: Timer 1 Compare Match B + "TIMER1_COMPC", // 14: Timer 1 Compare Match C + "TIMER1_OVF", // 15: Timer 1 Overflow + "TIMER0_COMP", // 16: Timer 0 Compare Match + "TIMER0_OVF", // 17: Timer 0 Overflow + "CANIT", // 18: CAN Transfer Complete or Error + "OVRIT", // 19: CAN Timer Overrun + "SPI_STC", // 20: SPI Serial Transfer Complete + "USART0_RX", // 21: USART 0 Receive Complete + "USART0_UDRE", // 22: USART 0 Data Register Empty + "USART0_TX", // 23: USART 0 Transmit Complete + "ANALOG_COMP", // 24: Analog Comparator + "ADC", // 25: ADC Conversion Complete + "EE_READY", // 26: EEPROM Ready + "TIMER3_CAPT", // 27: Timer 3 Capture Event + "TIMER3_COMPA", // 28: Timer 3 Compare Match A + "TIMER3_COMPB", // 29: Timer 3 Compare Match B + "TIMER3_COMPC", // 30: Timer 3 Compare Match C + "TIMER3_OVF", // 31: Timer 3 Overflow + "USART1_RX", // 32: USART 1 Receive Complete + "USART1_UDRE", // 33: USART 1 Data Register Empty + "USART1_TX", // 34: USART 1 Transmit Complete + "TWI", // 35: 2-Wire Interface + "SPM_READY", // 36: Store Program Memory Ready +}; + +const char * const vtab_at90pwm161[vts_at90pwm161] = { // AT90PWM161, AT90PWM81 + "RESET", // 0: Reset (various reasons) + "PSC2_CAPT", // 1: PSC 2 Capture Event + "PSC2_EC", // 2: PSC 2 End Cycle + "PSC2_EEC", // 3: PSC 2 End Of Enhanced Cycle + "PSC0_CAPT", // 4: PSC 0 Capture Event + "PSC0_EC", // 5: PSC 0 End Cycle + "PSC0_EEC", // 6: PSC 0 End Of Enhanced Cycle + "ANALOG_COMP_1", // 7: Analog Comparator 1 + "ANALOG_COMP_2", // 8: Analog Comparator 2 + "ANALOG_COMP_3", // 9: Analog Comparator 3 + "INT0", // 10: External Interrupt 0 + "TIMER1_CAPT", // 11: Timer 1 Capture Event + "TIMER1_OVF", // 12: Timer 1 Overflow + "ADC", // 13: ADC Conversion Complete + "INT1", // 14: External Interrupt 1 + "SPI_STC", // 15: SPI Serial Transfer Complete + "INT2", // 16: External Interrupt 2 + "WDT", // 17: Watchdog Time-out + "EE_READY", // 18: EEPROM Ready + "SPM_READY", // 19: Store Program Memory Ready +}; + +const char * const vtab_at90pwm316[vts_at90pwm316] = { // AT90PWM316, AT90PWM216, AT90PWM1 + "RESET", // 0: Reset (various reasons) + "PSC2_CAPT", // 1: PSC 2 Capture Event + "PSC2_EC", // 2: PSC 2 End Cycle + "PSC1_CAPT", // 3: PSC 1 Capture Event + "PSC1_EC", // 4: PSC 1 End Cycle + "PSC0_CAPT", // 5: PSC 0 Capture Event + "PSC0_EC", // 6: PSC 0 End Cycle + "ANALOG_COMP_0", // 7: Analog Comparator 0 + "ANALOG_COMP_1", // 8: Analog Comparator 1 + "ANALOG_COMP_2", // 9: Analog Comparator 2 + "INT0", // 10: External Interrupt 0 + "TIMER1_CAPT", // 11: Timer 1 Capture Event + "TIMER1_COMPA", // 12: Timer 1 Compare Match A + "TIMER1_COMPB", // 13: Timer 1 Compare Match B + "RESERVED15", // 14: Reserved 15 + "TIMER1_OVF", // 15: Timer 1 Overflow + "TIMER0_COMP_A", // 16: Timer 0 Compare Match A + "TIMER0_OVF", // 17: Timer 0 Overflow + "ADC", // 18: ADC Conversion Complete + "INT1", // 19: External Interrupt 1 + "SPI_STC", // 20: SPI Serial Transfer Complete + "USART_RX", // 21: USART Receive Complete + "USART_UDRE", // 22: USART Data Register Empty + "USART_TX", // 23: USART Transmit Complete + "INT2", // 24: External Interrupt 2 + "WDT", // 25: Watchdog Time-out + "EE_READY", // 26: EEPROM Ready + "TIMER0_COMPB", // 27: Timer 0 Compare Match B + "INT3", // 28: External Interrupt 3 + "RESERVED30", // 29: Reserved 30 + "RESERVED31", // 30: Reserved 31 + "SPM_READY", // 31: Store Program Memory Ready +}; + +const char * const vtab_at90s1200[vts_at90s1200] = { // AT90S1200 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "TIMER0_OVF", // 2: Timer 0 Overflow + "ANA_COMP", // 3: Analog Comparator +}; + +const char * const vtab_at90s2313[vts_at90s2313] = { // AT90S2313 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "TIMER1_CAPT1", // 3: Timer 1 Capture Event + "TIMER1_COMP1", // 4: Timer 1 Compare + "TIMER1_OVF1", // 5: Timer 1 Overflow + "TIMER0_OVF0", // 6: Timer 0 Overflow + "UART_RX", // 7: UART Receive Complete + "UART_UDRE", // 8: UART Data Register Empty + "UART_TX", // 9: UART Transmit Complete + "ANA_COMP", // 10: Analog Comparator +}; + +const char * const vtab_at90s4433[vts_at90s4433] = { // AT90S4433, AT90S2333 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "TIMER1_CAPT", // 3: Timer 1 Capture Event + "TIMER1_COMP", // 4: Timer 1 Compare + "TIMER1_OVF", // 5: Timer 1 Overflow + "TIMER0_OVF", // 6: Timer 0 Overflow + "SPI_STC", // 7: SPI Serial Transfer Complete + "UART_RX", // 8: UART Receive Complete + "UART_UDRE", // 9: UART Data Register Empty + "UART_TX", // 10: UART Transmit Complete + "ADC", // 11: ADC Conversion Complete + "EE_RDY", // 12: EEPROM Ready + "ANA_COMP", // 13: Analog Comparator +}; + +const char * const vtab_at90s8515[vts_at90s8515] = { // AT90S8515, AT90S4414 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "TIMER1_CAPT", // 3: Timer 1 Capture Event + "TIMER1_COMPA", // 4: Timer 1 Compare Match A + "TIMER1_COMPB", // 5: Timer 1 Compare Match B + "TIMER1_OVF", // 6: Timer 1 Overflow + "TIMER0_OVF", // 7: Timer 0 Overflow + "SPI_STC", // 8: SPI Serial Transfer Complete + "UART_RX", // 9: UART Receive Complete + "UART_UDRE", // 10: UART Data Register Empty + "UART_TX", // 11: UART Transmit Complete + "ANA_COMP", // 12: Analog Comparator +}; + +const char * const vtab_at90s8535[vts_at90s8535] = { // AT90S8535, AT90S4434 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "TIMER2_COMP", // 3: Timer 2 Compare Match + "TIMER2_OVF", // 4: Timer 2 Overflow + "TIMER1_CAPT", // 5: Timer 1 Capture Event + "TIMER1_COMPA", // 6: Timer 1 Compare Match A + "TIMER1_COMPB", // 7: Timer 1 Compare Match B + "TIMER1_OVF", // 8: Timer 1 Overflow + "TIMER0_OVF", // 9: Timer 0 Overflow + "SPI_STC", // 10: SPI Serial Transfer Complete + "UART_RX", // 11: UART Receive Complete + "UART_UDRE", // 12: UART Data Register Empty + "UART_TX", // 13: UART Transmit Complete + "ADC", // 14: ADC Conversion Complete + "EE_RDY", // 15: EEPROM Ready + "ANA_COMP", // 16: Analog Comparator +}; + +const char * const vtab_ata5272[vts_ata5272] = { // ATA5272 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "PCINT0", // 3: Pin Change Interrupt 0 + "PCINT1", // 4: Pin Change Interrupt 1 + "WDT", // 5: Watchdog Time-out + "TIMER1_CAPT", // 6: Timer 1 Capture Event + "TIMER1_COMPA", // 7: Timer 1 Compare Match A + "TIMER1_COMPB", // 8: Timer 1 Compare Match B + "TIMER1_OVF", // 9: Timer 1 Overflow + "TIMER0_COMPA", // 10: Timer 0 Compare Match A + "TIMER0_OVF", // 11: Timer 0 Overflow + "LIN_TC", // 12: LIN Transfer Complete + "LIN_ERR", // 13: LIN Error + "SPI_STC", // 14: SPI Serial Transfer Complete + "ADC", // 15: ADC Conversion Complete + "EE_RDY", // 16: EEPROM Ready + "UNUSED", // 17: not implemented on this device + "UNUSED", // 18: not implemented on this device + "USI_OVF", // 19: USI Overflow + "UNUSED", // 20: not implemented on this device + "UNUSED", // 21: not implemented on this device + "UNUSED", // 22: not implemented on this device + "UNUSED", // 23: not implemented on this device + "UNUSED", // 24: not implemented on this device + "UNUSED", // 25: not implemented on this device + "UNUSED", // 26: not implemented on this device + "UNUSED", // 27: not implemented on this device + "UNUSED", // 28: not implemented on this device + "UNUSED", // 29: not implemented on this device + "UNUSED", // 30: not implemented on this device + "UNUSED", // 31: not implemented on this device + "UNUSED", // 32: not implemented on this device + "UNUSED", // 33: not implemented on this device + "ANA_COMP", // 34: Analog Comparator + "UNUSED", // 35: not implemented on this device + "USI_START", // 36: USI Start Condition +}; + +const char * const vtab_ata5702m322[vts_ata5702m322] = { // ATA5702M322, ATA5700M322 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "PCI0", // 3: Pin Change Interrupt Request 0 + "PCI1", // 4: Pin Change Interrupt Request 1 + "VMON", // 5: Voltage Monitoring + "AVCCR", // 6: AVCC Reset + "AVCCL", // 7: AVCC Low + "T0INT", // 8: Timer 0 Interrupt + "T1COMP", // 9: Timer 1 Compare and Match + "T1OVF", // 10: Timer 1 Overflow + "T2COMP", // 11: Timer 2 Compare and Match + "T2OVF", // 12: Timer 2 Overflow + "T3CAP", // 13: Timer 3 Capture Event + "T3COMP", // 14: Timer 3 Compare and Match + "T3OVF", // 15: Timer 3 Overflow + "T4CAP", // 16: Timer 4 Capture Event + "T4COMP", // 17: Timer 4 Compare and Match + "T4OVF", // 18: Timer 4 Overflow + "T5COMP", // 19: Timer 5 Compare and Match + "T5OVF", // 20: Timer 5 Overflow + "SPI", // 21: SPI Serial Peripheral Interface + "SRX_FIFO", // 22: SPI Receive Buffer + "STX_FIFO", // 23: SPI Transmit Buffer + "SSM", // 24: Sequencer State Machine + "DFFLR", // 25: Data FIFO Fill Level Reached + "DFOUE", // 26: Data FIFO Overflow or Underflow Error + "SFFLR", // 27: RSSI/Preamble FIFO Fill Level Reached + "SFOUE", // 28: RSSI/Preamble FIFO Overflow or Underflow Error + "TMTCF", // 29: Transmit Modulator Telegram Finished + "AES", // 30: AES Crypto Unit + "TPINT", // 31: Transponder Mode Interrupt + "TPTOERR", // 32: Transponder Timeout Error + "LFID0INT", // 33: LF Receiver Identifier 0 Interrupt + "LFID1INT", // 34: LF Receiver Identifier 1 Interrupt + "LFFEINT", // 35: LF Receiver Frame End Interrupt + "LFBCR", // 36: LF Receiver Bit Count Reached + "LFPBD", // 37: LF Receiver PreBurst Detected + "LFDE", // 38: LF Receiver Decoder Error + "LFEOT", // 39: LF Receiver End of Telegram + "LFTCOR", // 40: LF Receiver Timer Compare + "LFRSCO", // 41: LF Receiver RSSI Measurement + "LDFFLR", // 42: Data FIFO Fill Level Reached + "LDFOUE", // 43: Data FIFO Overflow or Underflow Error + "EXCM", // 44: External Input Clock Break Down + "E2CINT", // 45: EEPROM Error Correction Interrupt + "ERDY", // 46: EEPROM Ready + "SPMR", // 47: Store Program Memory Ready + "TWI1", // 48: 2-Wire Interface 1 + "SPI2", // 49: SPI 2 Serial Peripheral Interface + "TWI2", // 50: 2-Wire Interface 2 +}; + +const char * const vtab_ata5790[vts_ata5790] = { // ATA5790 + "RESET", // 0: Reset (various reasons) + "TPINT", // 1: Transponder Mode Interrupt + "INT0", // 2: External Interrupt 0 + "PCINT0", // 3: Pin Change Interrupt 0 + "PCINT1", // 4: Pin Change Interrupt 1 + "VMINT", // 5: Voltage Monitoring Interrupt + "T0INT", // 6: Timer 0 Interrupt + "LFID0INT", // 7: LF Receiver Identifier 0 Interrupt + "LFID1INT", // 8: LF Receiver Identifier 1 Interrupt + "LFFEINT", // 9: LF Receiver Frame End Interrupt + "LFDBINT", // 10: LF Receiver Data Buffer Full Interrupt + "T3CAPINT", // 11: Timer 3 Capture Event Interrupt + "T3COMINT", // 12: Timer 3 Compare and Match Interrupt + "T3OVFINT", // 13: Timer 3 Overflow Interrupt + "T2COMINT", // 14: Timer 2 Compare and Match Interrupt + "T2OVFINT", // 15: Timer 2 Overflow Interrupt + "T1INT", // 16: Timer 1 Interrupt + "SPISTC", // 17: SPI Serial Transfer Complete + "TMRXBINT", // 18: Timer Modulator Receive Buffer Interrupt + "TMTXBINT", // 19: Timer Modulator Transmit Buffer Interrupt + "TMTXCINT", // 20: Timer Modulator Transmit Complete Interrupt + "AESINT", // 21: AES Crypto Unit Interrupt + "LFRSSINT", // 22: LF Receiver RSSI Interrupt + "LFSDINT", // 23: LF Receiver Signal Detect Interrupt + "LFMDINT", // 24: LF Receiver Manchester Decoder Error Interrupt + "EXCMINT", // 25: External Input Clock Monitoring Interrupt + "EXXMINT", // 26: External XTAL Oscillator Break Down Interrupt + "RTCINT", // 27: Real Time Clock Interrupt + "EEREADY", // 28: EEPROM Ready + "SPMREADY", // 29: Store Program Memory Ready +}; + +const char * const vtab_ata5791[vts_ata5791] = { // ATA5791, ATA5790N + "RESET", // 0: Reset (various reasons) + "TPINT", // 1: Transponder Mode Interrupt + "INT0", // 2: External Interrupt 0 + "PCINT0", // 3: Pin Change Interrupt 0 + "PCINT1", // 4: Pin Change Interrupt 1 + "VMINT", // 5: Voltage Monitoring Interrupt + "T0INT", // 6: Timer 0 Interrupt + "LFID0INT", // 7: LF Receiver Identifier 0 Interrupt + "LFID1INT", // 8: LF Receiver Identifier 1 Interrupt + "LFFEINT", // 9: LF Receiver Frame End Interrupt + "LFDBINT", // 10: LF Receiver Data Buffer Full Interrupt + "T3CAPINT", // 11: Timer 3 Capture Event Interrupt + "T3COMINT", // 12: Timer 3 Compare and Match Interrupt + "T3OVFINT", // 13: Timer 3 Overflow Interrupt + "T3COM2INT", // 14: Timer 3 Compare and Match 2 Interrupt + "T2COMINT", // 15: Timer 2 Compare and Match Interrupt + "T2OVFINT", // 16: Timer 2 Overflow Interrupt + "T1INT", // 17: Timer 1 Interrupt + "SPISTC", // 18: SPI Serial Transfer Complete + "TMRXBINT", // 19: Timer Modulator Receive Buffer Interrupt + "TMTXBINT", // 20: Timer Modulator Transmit Buffer Interrupt + "TMTXCINT", // 21: Timer Modulator Transmit Complete Interrupt + "AESINT", // 22: AES Crypto Unit Interrupt + "LFRSSINT", // 23: LF Receiver RSSI Interrupt + "LFSDINT", // 24: LF Receiver Signal Detect Interrupt + "LFMDINT", // 25: LF Receiver Manchester Decoder Error Interrupt + "EXCMINT", // 26: External Input Clock Monitoring Interrupt + "EXXMINT", // 27: External XTAL Oscillator Break Down Interrupt + "RTCINT", // 28: Real Time Clock Interrupt + "EEREADY", // 29: EEPROM Ready + "SPMREADY", // 30: Store Program Memory Ready +}; + +const char * const vtab_ata5795[vts_ata5795] = { // ATA5795 + "RESET", // 0: Reset (various reasons) + "TPINT", // 1: Transponder Mode Interrupt + "INT0", // 2: External Interrupt 0 + "PCINT0", // 3: Pin Change Interrupt 0 + "PCINT1", // 4: Pin Change Interrupt 1 + "VMINT", // 5: Voltage Monitoring Interrupt + "T0INT", // 6: Timer 0 Interrupt + "T3CAPINT", // 7: Timer 3 Capture Event Interrupt + "T3COMINT", // 8: Timer 3 Compare and Match Interrupt + "T3OVFINT", // 9: Timer 3 Overflow Interrupt + "T2COMINT", // 10: Timer 2 Compare and Match Interrupt + "T2OVFINT", // 11: Timer 2 Overflow Interrupt + "T1INT", // 12: Timer 1 Interrupt + "SPISTC", // 13: SPI Serial Transfer Complete + "TMRXBINT", // 14: Timer Modulator Receive Buffer Interrupt + "TMTXBINT", // 15: Timer Modulator Transmit Buffer Interrupt + "TMTXCINT", // 16: Timer Modulator Transmit Complete Interrupt + "AESINT", // 17: AES Crypto Unit Interrupt + "EXCMINT", // 18: External Input Clock Monitoring Interrupt + "EXXMINT", // 19: External XTAL Oscillator Break Down Interrupt + "RTCINT", // 20: Real Time Clock Interrupt + "EEREADY", // 21: EEPROM Ready + "SPMREADY", // 22: Store Program Memory Ready +}; + +const char * const vtab_ata5835[vts_ata5835] = { // ATA5835, ATA5787 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "PCI0", // 3: Pin Change Interrupt Request 0 + "PCI1", // 4: Pin Change Interrupt Request 1 + "VMON", // 5: Voltage Monitoring + "AVCCR", // 6: AVCC Reset + "AVCCL", // 7: AVCC Low + "T0INT", // 8: Timer 0 Interrupt + "T1COMP", // 9: Timer 1 Compare and Match + "T1OVF", // 10: Timer 1 Overflow + "T2COMP", // 11: Timer 2 Compare and Match + "T2OVF", // 12: Timer 2 Overflow + "T3CAP", // 13: Timer 3 Capture Event + "T3COMP", // 14: Timer 3 Compare and Match + "T3OVF", // 15: Timer 3 Overflow + "T4CAP", // 16: Timer 4 Capture Event + "T4COMP", // 17: Timer 4 Compare and Match + "T4OVF", // 18: Timer 4 Overflow + "T5COMP", // 19: Timer 5 Compare and Match + "T5OVF", // 20: Timer 5 Overflow + "SPI", // 21: SPI Serial Peripheral Interface + "SRX_FIFO", // 22: SPI Receive Buffer + "STX_FIFO", // 23: SPI Transmit Buffer + "LINTC", // 24: LIN Transfer Complete + "LINERR", // 25: LIN Error + "SSM", // 26: Sequencer State Machine + "DFFLR", // 27: Data FIFO Fill Level Reached + "DFOUE", // 28: Data FIFO Overflow or Underflow Error + "SFFLR", // 29: RSSI/Preamble FIFO Fill Level Reached + "SFOUE", // 30: RSSI/Preamble FIFO Overflow or Underflow Error + "TMTCF", // 31: Transmit Modulator Telegram Finished + "UHF_WCOA", // 32: UHF Receiver Wake Up OK on Receive Path A + "UHF_WCOB", // 33: UHF Receiver Wake Up OK on Receive Path B + "UHF_SOTA", // 34: UHF Receiver Start of Telegram OK on Receive Path A + "UHF_SOTB", // 35: UHF Receiver Start of Telegram OK on Receive Path B + "UHF_EOTA", // 36: UHF Receiver End of Telegram on Receive Path A + "UHF_EOTB", // 37: UHF Receiver End of Telegram on Receive Path B + "UHF_NBITA", // 38: UHF Receiver New Bit on Receive Path A + "UHF_NBITB", // 39: UHF Receiver New Bit on Receive Path B + "EXCM", // 40: External Input Clock Break Down + "ERDY", // 41: EEPROM Ready + "SPMR", // 42: Store Program Memory Ready + "IDFULL", // 43: IDSCAN Full +}; + +const char * const vtab_ata6289[vts_ata6289] = { // ATA6289, ATA6286, ATA6285 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "PCINT0", // 3: Pin Change Interrupt 0 + "PCINT1", // 4: Pin Change Interrupt 1 + "PCINT2", // 5: Pin Change Interrupt 2 + "INTVM", // 6: Voltage Monitor Interrupt + "SENINT", // 7: Sensor Interface Interrupt + "INTT0", // 8: Timer 0 Interval Interrupt + "LFWP", // 9: LF-Receiver Wake-up + "T3CAP", // 10: Timer 3 Capture Event + "T3COMA", // 11: Timer 3 Compare Match A + "T3COMB", // 12: Timer 3 Compare Match B + "T3OVF", // 13: Timer 3 Overflow + "T2CAP", // 14: Timer 2 Capture Event + "T2COM", // 15: Timer 2 Compare Match + "T2OVF", // 16: Timer 2 Overflow + "SPISTC", // 17: SPI Serial Transfer Complete + "LFRXB", // 18: LF Receive Buffer + "INTT1", // 19: Timer 1 Interval Interrupt + "T2RXB", // 20: Timer 2 SSI Receive Buffer + "T2TXB", // 21: Timer 2 SSI Transmit Buffer + "T2TXC", // 22: Timer 2 SSI Transmit Complete + "LFREOB", // 23: LF-Receiver End of Burst + "EXCM", // 24: External Input Clock Break Down + "EEREADY", // 25: EEPROM Ready + "SPM_RDY", // 26: Store Program Memory Ready +}; + +const char * const vtab_ata8515[vts_ata8515] = { // ATA8515, ATA8510, ATA8215, ATA8210, ATA5833, ATA5832, ATA5831, ATA5783, ATA5782, ATA5781 + "RESET", // 0: Reset (various reasons) + "INT0", // 1: External Interrupt 0 + "INT1", // 2: External Interrupt 1 + "PCI0", // 3: Pin Change Interrupt Request 0 + "PCI1", // 4: Pin Change Interrupt Request 1 + "VMON", // 5: Voltage Monitoring + "AVCCR", // 6: AVCC Reset + "AVCCL", // 7: AVCC Low + "T0INT", // 8: Timer 0 Interrupt + "T1COMP", // 9: Timer 1 Compare and Match + "T1OVF", // 10: Timer 1 Overflow + "T2COMP", // 11: Timer 2 Compare and Match + "T2OVF", // 12: Timer 2 Overflow + "T3CAP", // 13: Timer 3 Capture Event + "T3COMP", // 14: Timer 3 Compare and Match + "T3OVF", // 15: Timer 3 Overflow + "T4CAP", // 16: Timer 4 Capture Event + "T4COMP", // 17: Timer 4 Compare and Match + "T4OVF", // 18: Timer 4 Overflow + "T5COMP", // 19: Timer 5 Compare and Match + "T5OVF", // 20: Timer 5 Overflow + "SPI", // 21: SPI Serial Peripheral Interface + "SRX_FIFO", // 22: SPI Receive Buffer + "STX_FIFO", // 23: SPI Transmit Buffer + "SSM", // 24: Sequencer State Machine + "DFFLR", // 25: Data FIFO Fill Level Reached + "DFOUE", // 26: Data FIFO Overflow or Underflow Error + "SFFLR", // 27: RSSI/Preamble FIFO Fill Level Reached + "SFOUE", // 28: RSSI/Preamble FIFO Overflow or Underflow Error + "TMTCF", // 29: Transmit Modulator Telegram Finished + "UHF_WCOB", // 30: UHF Receiver Wake Up OK on Receive Path B + "UHF_WCOA", // 31: UHF Receiver Wake Up OK on Receive Path A + "UHF_SOTB", // 32: UHF Receiver Start of Telegram OK on Receive Path B + "UHF_SOTA", // 33: UHF Receiver Start of Telegram OK on Receive Path A + "UHF_EOTB", // 34: UHF Receiver End of Telegram on Receive Path B + "UHF_EOTA", // 35: UHF Receiver End of Telegram on Receive Path A + "UHF_NBITB", // 36: UHF Receiver New Bit on Receive Path B + "UHF_NBITA", // 37: UHF Receiver New Bit on Receive Path A + "EXCM", // 38: External Input Clock Break Down + "ERDY", // 39: EEPROM Ready + "SPMR", // 40: Store Program Memory Ready + "IDFULL", // 41: IDSCAN Full +}; + +const char * const vtab_atxmega32a4[vts_atxmega32a4] = { // ATxmega32A4, ATxmega16A4 + "RESET", // 0: Reset (various reasons) + "OSC_OSCF", // 1: Oscillator Failure NMI + "PORTC_INT0", // 2: External Interrupt 0 PORT C + "PORTC_INT1", // 3: External Interrupt 1 PORT C + "PORTR_INT0", // 4: External Interrupt 0 PORT R + "PORTR_INT1", // 5: External Interrupt 1 PORT R + "DMA_CH0", // 6: DMA Channel 0 + "DMA_CH1", // 7: DMA Channel 1 + "DMA_CH2", // 8: DMA Channel 2 + "DMA_CH3", // 9: DMA Channel 3 + "RTC_OVF", // 10: RTC Overflow + "RTC_COMP", // 11: RTC Compare + "TWIC_TWIS", // 12: 2-Wire Interface C Periphery + "TWIC_TWIM", // 13: 2-Wire Interface C Controller + "TCC0_OVF", // 14: TC C0 Overflow + "TCC0_ERR", // 15: TC C0 Error + "TCC0_CCA", // 16: TC C0 Compare or Capture A + "TCC0_CCB", // 17: TC C0 Compare or Capture B + "TCC0_CCC", // 18: TC C0 Compare or Capture C + "TCC0_CCD", // 19: TC C0 Compare or Capture D + "TCC1_OVF", // 20: TC C1 Overflow + "TCC1_ERR", // 21: TC C1 Error + "TCC1_CCA", // 22: TC C1 Compare or Capture A + "TCC1_CCB", // 23: TC C1 Compare or Capture B + "SPIC_INT", // 24: SPI C Interrupt + "USARTC0_RXC", // 25: USARTC 0 Reception Complete + "USARTC0_DRE", // 26: USARTC 0 Data Register Empty + "USARTC0_TXC", // 27: USARTC 0 Transmission Complete + "USARTC1_RXC", // 28: USARTC 1 Reception Complete + "USARTC1_DRE", // 29: USARTC 1 Data Register Empty + "USARTC1_TXC", // 30: USARTC 1 Transmission Complete + "AES_INT", // 31: AES Interrupt + "NVM_EE", // 32: NVM EEPROM + "NVM_SPM", // 33: NVM SPM + "PORTB_INT0", // 34: External Interrupt 0 PORT B + "PORTB_INT1", // 35: External Interrupt 1 PORT B + "UNUSED", // 36: not implemented on this device + "UNUSED", // 37: not implemented on this device + "UNUSED", // 38: not implemented on this device + "UNUSED", // 39: not implemented on this device + "UNUSED", // 40: not implemented on this device + "UNUSED", // 41: not implemented on this device + "UNUSED", // 42: not implemented on this device + "PORTE_INT0", // 43: External Interrupt 0 PORT E + "PORTE_INT1", // 44: External Interrupt 1 PORT E + "TWIE_TWIS", // 45: 2-Wire Interface E Periphery + "TWIE_TWIM", // 46: 2-Wire Interface E Controller + "TCE0_OVF", // 47: TC E0 Overflow + "TCE0_ERR", // 48: TC E0 Error + "TCE0_CCA", // 49: TC E0 Compare or Capture A + "TCE0_CCB", // 50: TC E0 Compare or Capture B + "TCE0_CCC", // 51: TC E0 Compare or Capture C + "TCE0_CCD", // 52: TC E0 Compare or Capture D + "HIRESE_OVF", // 53: High-resolution Extension Overflow + "HIRESE_ERR", // 54: High-resolution Extension Error + "HIRESE_CCA", // 55: High-resolution Extension Compare and Capture A + "HIRESE_CCB", // 56: High-resolution Extension Compare and Capture B + "UNUSED", // 57: not implemented on this device + "USARTE0_RXC", // 58: USARTE 0 Reception Complete + "USARTE0_DRE", // 59: USARTE 0 Data Register Empty + "USARTE0_TXC", // 60: USARTE 0 Transmission Complete + "UNUSED", // 61: not implemented on this device + "UNUSED", // 62: not implemented on this device + "UNUSED", // 63: not implemented on this device + "PORTD_INT0", // 64: External Interrupt 0 PORT D + "PORTD_INT1", // 65: External Interrupt 1 PORT D + "PORTA_INT0", // 66: External Interrupt 0 PORT A + "PORTA_INT1", // 67: External Interrupt 1 PORT A + "ACA_AC0", // 68: ACA AC 0 Interrupt + "ACA_AC1", // 69: ACA AC 1 Interrupt + "ACA_ACW", // 70: ACA AC Window Mode + "ADCA_CH0", // 71: ADCA Interrupt 0 + "ADCA_CH1", // 72: ADCA Interrupt 1 + "ADCA_CH2", // 73: ADCA Interrupt 2 + "ADCA_CH3", // 74: ADCA Interrupt 3 + "UNUSED", // 75: not implemented on this device + "UNUSED", // 76: not implemented on this device + "TCD0_OVF", // 77: TC D0 Overflow + "TCD0_ERR", // 78: TC D0 Error + "TCD0_CCA", // 79: TC D0 Compare or Capture A + "TCD0_CCB", // 80: TC D0 Compare or Capture B + "TCD0_CCC", // 81: TC D0 Compare or Capture C + "TCD0_CCD", // 82: TC D0 Compare or Capture D + "TCD1_OVF", // 83: TC D1 Overflow + "TCD1_ERR", // 84: TC D1 Error + "TCD1_CCA", // 85: TC D1 Compare or Capture A + "TCD1_CCB", // 86: TC D1 Compare or Capture B + "SPID_INT", // 87: SPI D Interrupt + "USARTD0_RXC", // 88: USARTD 0 Reception Complete + "USARTD0_DRE", // 89: USARTD 0 Data Register Empty + "USARTD0_TXC", // 90: USARTD 0 Transmission Complete + "USARTD1_RXC", // 91: USARTD 1 Reception Complete + "USARTD1_DRE", // 92: USARTD 1 Data Register Empty + "USARTD1_TXC", // 93: USARTD 1 Transmission Complete +}; + +const char * const vtab_atxmega32c4[vts_atxmega32c4] = { // ATxmega32C4, ATxmega16C4 + "RESET", // 0: Reset (various reasons) + "OSC_OSCF", // 1: Oscillator Failure NMI + "PORTC_INT0", // 2: External Interrupt 0 PORT C + "PORTC_INT1", // 3: External Interrupt 1 PORT C + "PORTR_INT0", // 4: External Interrupt 0 PORT R + "PORTR_INT1", // 5: External Interrupt 1 PORT R + "UNUSED", // 6: not implemented on this device + "UNUSED", // 7: not implemented on this device + "UNUSED", // 8: not implemented on this device + "UNUSED", // 9: not implemented on this device + "RTC_OVF", // 10: RTC Overflow + "RTC_COMP", // 11: RTC Compare + "TWIC_TWIS", // 12: 2-Wire Interface C Periphery + "TWIC_TWIM", // 13: 2-Wire Interface C Controller + "TCC0_OVF/TCC2_LUNF", // 14: TC C0 Overflow/TC C2 Low Byte Underflow + "TCC0_ERR/TCC2_HUNF", // 15: TC C0 Error/TC C2 High Byte Underflow + "TCC0_CCA/TCC2_LCMPA", // 16: TC C0 Compare or Capture A/TC C2 Low Byte Compare A + "TCC0_CCB/TCC2_LCMPB", // 17: TC C0 Compare or Capture B/TC C2 Low Byte Compare B + "TCC0_CCC/TCC2_LCMPC", // 18: TC C0 Compare or Capture C/TC C2 Low Byte Compare C + "TCC0_CCD/TCC2_LCMPD", // 19: TC C0 Compare or Capture D/TC C2 Low Byte Compare D + "TCC1_OVF", // 20: TC C1 Overflow + "TCC1_ERR", // 21: TC C1 Error + "TCC1_CCA", // 22: TC C1 Compare or Capture A + "TCC1_CCB", // 23: TC C1 Compare or Capture B + "SPIC_INT", // 24: SPI C Interrupt + "USARTC0_RXC", // 25: USARTC 0 Reception Complete + "USARTC0_DRE", // 26: USARTC 0 Data Register Empty + "USARTC0_TXC", // 27: USARTC 0 Transmission Complete + "USARTC1_RXC", // 28: USARTC 1 Reception Complete + "USARTC1_DRE", // 29: USARTC 1 Data Register Empty + "USARTC1_TXC", // 30: USARTC 1 Transmission Complete + "UNUSED", // 31: not implemented on this device + "NVM_EE", // 32: NVM EEPROM + "NVM_SPM", // 33: NVM SPM + "PORTB_INT0", // 34: External Interrupt 0 PORT B + "PORTB_INT1", // 35: External Interrupt 1 PORT B + "UNUSED", // 36: not implemented on this device + "UNUSED", // 37: not implemented on this device + "UNUSED", // 38: not implemented on this device + "UNUSED", // 39: not implemented on this device + "UNUSED", // 40: not implemented on this device + "UNUSED", // 41: not implemented on this device + "UNUSED", // 42: not implemented on this device + "PORTE_INT0", // 43: External Interrupt 0 PORT E + "PORTE_INT1", // 44: External Interrupt 1 PORT E + "TWIE_TWIS", // 45: 2-Wire Interface E Periphery + "TWIE_TWIM", // 46: 2-Wire Interface E Controller + "TCE0_OVF", // 47: TC E0 Overflow + "TCE0_ERR", // 48: TC E0 Error + "TCE0_CCA", // 49: TC E0 Compare or Capture A + "TCE0_CCB", // 50: TC E0 Compare or Capture B + "TCE0_CCC", // 51: TC E0 Compare or Capture C + "TCE0_CCD", // 52: TC E0 Compare or Capture D + "UNUSED", // 53: not implemented on this device + "UNUSED", // 54: not implemented on this device + "UNUSED", // 55: not implemented on this device + "UNUSED", // 56: not implemented on this device + "UNUSED", // 57: not implemented on this device + "UNUSED", // 58: not implemented on this device + "UNUSED", // 59: not implemented on this device + "UNUSED", // 60: not implemented on this device + "UNUSED", // 61: not implemented on this device + "UNUSED", // 62: not implemented on this device + "UNUSED", // 63: not implemented on this device + "PORTD_INT0", // 64: External Interrupt 0 PORT D + "PORTD_INT1", // 65: External Interrupt 1 PORT D + "PORTA_INT0", // 66: External Interrupt 0 PORT A + "PORTA_INT1", // 67: External Interrupt 1 PORT A + "ACA_AC0", // 68: ACA AC 0 Interrupt + "ACA_AC1", // 69: ACA AC 1 Interrupt + "ACA_ACW", // 70: ACA AC Window Mode + "ADCA_CH0", // 71: ADCA Interrupt 0 + "UNUSED", // 72: not implemented on this device + "UNUSED", // 73: not implemented on this device + "UNUSED", // 74: not implemented on this device + "UNUSED", // 75: not implemented on this device + "UNUSED", // 76: not implemented on this device + "TCD0_OVF/TCD2_LUNF", // 77: TC D0 Overflow/TC D2 Low Byte Underflow + "TCD0_ERR/TCD2_HUNF", // 78: TC D0 Error/TC D2 High Byte Underflow + "TCD0_CCA/TCD2_LCMPA", // 79: TC D0 Compare or Capture A/TC D2 Low Byte Compare A + "TCD0_CCB/TCD2_LCMPB", // 80: TC D0 Compare or Capture B/TC D2 Low Byte Compare B + "TCD0_CCC/TCD2_LCMPC", // 81: TC D0 Compare or Capture C/TC D2 Low Byte Compare C + "TCD0_CCD/TCD2_LCMPD", // 82: TC D0 Compare or Capture D/TC D2 Low Byte Compare D + "UNUSED", // 83: not implemented on this device + "UNUSED", // 84: not implemented on this device + "UNUSED", // 85: not implemented on this device + "UNUSED", // 86: not implemented on this device + "SPID_INT", // 87: SPI D Interrupt + "USARTD0_RXC", // 88: USARTD 0 Reception Complete + "USARTD0_DRE", // 89: USARTD 0 Data Register Empty + "USARTD0_TXC", // 90: USARTD 0 Transmission Complete + "UNUSED", // 91: not implemented on this device + "UNUSED", // 92: not implemented on this device + "UNUSED", // 93: not implemented on this device + "UNUSED", // 94: not implemented on this device + "UNUSED", // 95: not implemented on this device + "UNUSED", // 96: not implemented on this device + "UNUSED", // 97: not implemented on this device + "UNUSED", // 98: not implemented on this device + "UNUSED", // 99: not implemented on this device + "UNUSED", // 100: not implemented on this device + "UNUSED", // 101: not implemented on this device + "UNUSED", // 102: not implemented on this device + "UNUSED", // 103: not implemented on this device + "UNUSED", // 104: not implemented on this device + "UNUSED", // 105: not implemented on this device + "UNUSED", // 106: not implemented on this device + "UNUSED", // 107: not implemented on this device + "UNUSED", // 108: not implemented on this device + "UNUSED", // 109: not implemented on this device + "UNUSED", // 110: not implemented on this device + "UNUSED", // 111: not implemented on this device + "UNUSED", // 112: not implemented on this device + "UNUSED", // 113: not implemented on this device + "UNUSED", // 114: not implemented on this device + "UNUSED", // 115: not implemented on this device + "UNUSED", // 116: not implemented on this device + "UNUSED", // 117: not implemented on this device + "UNUSED", // 118: not implemented on this device + "UNUSED", // 119: not implemented on this device + "UNUSED", // 120: not implemented on this device + "UNUSED", // 121: not implemented on this device + "UNUSED", // 122: not implemented on this device + "UNUSED", // 123: not implemented on this device + "UNUSED", // 124: not implemented on this device + "USB_BUSEVENT", // 125: SOF, Suspend, Resume, Reset Bus Event Interrupts, CRC, Underflow, Overflow or Stall Error + "USB_TRNCOMPL", // 126: USB Transaction Complete +}; + +const char * const vtab_atxmega32d4[vts_atxmega32d4] = { // ATxmega32D4, ATxmega16D4 + "RESET", // 0: Reset (various reasons) + "OSC_OSCF", // 1: Oscillator Failure NMI + "PORTC_INT0", // 2: External Interrupt 0 PORT C + "PORTC_INT1", // 3: External Interrupt 1 PORT C + "PORTR_INT0", // 4: External Interrupt 0 PORT R + "PORTR_INT1", // 5: External Interrupt 1 PORT R + "UNUSED", // 6: not implemented on this device + "UNUSED", // 7: not implemented on this device + "UNUSED", // 8: not implemented on this device + "UNUSED", // 9: not implemented on this device + "RTC_OVF", // 10: RTC Overflow + "RTC_COMP", // 11: RTC Compare + "TWIC_TWIS", // 12: 2-Wire Interface C Periphery + "TWIC_TWIM", // 13: 2-Wire Interface C Controller + "TCC0_OVF/TCC2_LUNF", // 14: TC C0 Overflow/TC C2 Low Byte Underflow + "TCC0_ERR/TCC2_HUNF", // 15: TC C0 Error/TC C2 High Byte Underflow + "TCC0_CCA/TCC2_LCMPA", // 16: TC C0 Compare or Capture A/TC C2 Low Byte Compare A + "TCC0_CCB/TCC2_LCMPB", // 17: TC C0 Compare or Capture B/TC C2 Low Byte Compare B + "TCC0_CCC/TCC2_LCMPC", // 18: TC C0 Compare or Capture C/TC C2 Low Byte Compare C + "TCC0_CCD/TCC2_LCMPD", // 19: TC C0 Compare or Capture D/TC C2 Low Byte Compare D + "TCC1_OVF", // 20: TC C1 Overflow + "TCC1_ERR", // 21: TC C1 Error + "TCC1_CCA", // 22: TC C1 Compare or Capture A + "TCC1_CCB", // 23: TC C1 Compare or Capture B + "SPIC_INT", // 24: SPI C Interrupt + "USARTC0_RXC", // 25: USARTC 0 Reception Complete + "USARTC0_DRE", // 26: USARTC 0 Data Register Empty + "USARTC0_TXC", // 27: USARTC 0 Transmission Complete + "UNUSED", // 28: not implemented on this device + "UNUSED", // 29: not implemented on this device + "UNUSED", // 30: not implemented on this device + "UNUSED", // 31: not implemented on this device + "NVM_EE", // 32: NVM EEPROM + "NVM_SPM", // 33: NVM SPM + "PORTB_INT0", // 34: External Interrupt 0 PORT B + "PORTB_INT1", // 35: External Interrupt 1 PORT B + "UNUSED", // 36: not implemented on this device + "UNUSED", // 37: not implemented on this device + "UNUSED", // 38: not implemented on this device + "UNUSED", // 39: not implemented on this device + "UNUSED", // 40: not implemented on this device + "UNUSED", // 41: not implemented on this device + "UNUSED", // 42: not implemented on this device + "PORTE_INT0", // 43: External Interrupt 0 PORT E + "PORTE_INT1", // 44: External Interrupt 1 PORT E + "TWIE_TWIS", // 45: 2-Wire Interface E Periphery + "TWIE_TWIM", // 46: 2-Wire Interface E Controller + "TCE0_OVF", // 47: TC E0 Overflow + "TCE0_ERR", // 48: TC E0 Error + "TCE0_CCA", // 49: TC E0 Compare or Capture A + "TCE0_CCB", // 50: TC E0 Compare or Capture B + "TCE0_CCC", // 51: TC E0 Compare or Capture C + "TCE0_CCD", // 52: TC E0 Compare or Capture D + "UNUSED", // 53: not implemented on this device + "UNUSED", // 54: not implemented on this device + "UNUSED", // 55: not implemented on this device + "UNUSED", // 56: not implemented on this device + "UNUSED", // 57: not implemented on this device + "UNUSED", // 58: not implemented on this device + "UNUSED", // 59: not implemented on this device + "UNUSED", // 60: not implemented on this device + "UNUSED", // 61: not implemented on this device + "UNUSED", // 62: not implemented on this device + "UNUSED", // 63: not implemented on this device + "PORTD_INT0", // 64: External Interrupt 0 PORT D + "PORTD_INT1", // 65: External Interrupt 1 PORT D + "PORTA_INT0", // 66: External Interrupt 0 PORT A + "PORTA_INT1", // 67: External Interrupt 1 PORT A + "ACA_AC0", // 68: ACA AC 0 Interrupt + "ACA_AC1", // 69: ACA AC 1 Interrupt + "ACA_ACW", // 70: ACA AC Window Mode + "ADCA_CH0", // 71: ADCA Interrupt 0 + "ADCA_CH1", // 72: ADCA Interrupt 1 + "ADCA_CH2", // 73: ADCA Interrupt 2 + "ADCA_CH3", // 74: ADCA Interrupt 3 + "UNUSED", // 75: not implemented on this device + "UNUSED", // 76: not implemented on this device + "TCD0_OVF", // 77: TC D0 Overflow + "TCD0_ERR", // 78: TC D0 Error + "TCD0_CCA", // 79: TC D0 Compare or Capture A + "TCD0_CCB", // 80: TC D0 Compare or Capture B + "TCD0_CCC", // 81: TC D0 Compare or Capture C + "TCD0_CCD", // 82: TC D0 Compare or Capture D + "UNUSED", // 83: not implemented on this device + "UNUSED", // 84: not implemented on this device + "UNUSED", // 85: not implemented on this device + "UNUSED", // 86: not implemented on this device + "SPID_INT", // 87: SPI D Interrupt + "USARTD0_RXC", // 88: USARTD 0 Reception Complete + "USARTD0_DRE", // 89: USARTD 0 Data Register Empty + "USARTD0_TXC", // 90: USARTD 0 Transmission Complete +}; + +const char * const vtab_atxmega32e5[vts_atxmega32e5] = { // ATxmega32E5, ATxmega16E5, ATxmega8E5 + "RESET", // 0: Reset (various reasons) + "OSC_OSCF", // 1: Oscillator Failure NMI + "PORTR_INT", // 2: External Interrupt PORT R + "EDMA_CH0", // 3: External DMA Channel 0 + "EDMA_CH1", // 4: External DMA Channel 1 + "EDMA_CH2", // 5: External DMA Channel 2 + "EDMA_CH3", // 6: External DMA Channel 3 + "RTC_OVF", // 7: RTC Overflow + "RTC_COMP", // 8: RTC Compare + "PORTC_INT", // 9: External Interrupt PORT C + "TWIC_TWIS", // 10: 2-Wire Interface C Periphery + "TWIC_TWIM", // 11: 2-Wire Interface C Controller + "TCC4_OVF", // 12: TC C4 Overflow + "TCC4_ERR", // 13: TC C4 Error + "TCC4_CCA", // 14: TC C4 Compare or Capture A + "TCC4_CCB", // 15: TC C4 Compare or Capture B + "TCC4_CCC", // 16: TC C4 Compare or Capture C + "TCC4_CCD", // 17: TC C4 Compare or Capture D + "TCC5_OVF", // 18: TC C5 Overflow + "TCC5_ERR", // 19: TC C5 Error + "TCC5_CCA", // 20: TC C5 Compare or Capture A + "TCC5_CCB", // 21: TC C5 Compare or Capture B + "SPIC_INT", // 22: SPI C Interrupt + "USARTC0_RXC", // 23: USARTC 0 Reception Complete + "USARTC0_DRE", // 24: USARTC 0 Data Register Empty + "USARTC0_TXC", // 25: USARTC 0 Transmission Complete + "NVM_EE", // 26: NVM EEPROM + "NVM_SPM", // 27: NVM SPM + "XCL_UNF", // 28: XMEGA Custom Logic Underflow + "XCL_CC", // 29: XMEGA Custom Logic Compare or Capture + "PORTA_INT", // 30: External Interrupt PORT A + "ACA_AC0", // 31: ACA AC 0 Interrupt + "ACA_AC1", // 32: ACA AC 1 Interrupt + "ACA_ACW", // 33: ACA AC Window Mode + "ADCA_CH0", // 34: ADCA Interrupt 0 + "PORTD_INT", // 35: External Interrupt PORT D + "TCD5_OVF", // 36: TC D5 Overflow + "TCD5_ERR", // 37: TC D5 Error + "TCD5_CCA", // 38: TC D5 Compare or Capture A + "TCD5_CCB", // 39: TC D5 Compare or Capture B + "USARTD0_RXC", // 40: USARTD 0 Reception Complete + "USARTD0_DRE", // 41: USARTD 0 Data Register Empty + "USARTD0_TXC", // 42: USARTD 0 Transmission Complete +}; + +const char * const vtab_atxmega128a1[vts_atxmega128a1] = { // ATxmega128A1, ATxmega64A1 + "RESET", // 0: Reset (various reasons) + "OSC_OSCF", // 1: Oscillator Failure NMI + "PORTC_INT0", // 2: External Interrupt 0 PORT C + "PORTC_INT1", // 3: External Interrupt 1 PORT C + "PORTR_INT0", // 4: External Interrupt 0 PORT R + "PORTR_INT1", // 5: External Interrupt 1 PORT R + "DMA_CH0", // 6: DMA Channel 0 + "DMA_CH1", // 7: DMA Channel 1 + "DMA_CH2", // 8: DMA Channel 2 + "DMA_CH3", // 9: DMA Channel 3 + "RTC_OVF", // 10: RTC Overflow + "RTC_COMP", // 11: RTC Compare + "TWIC_TWIS", // 12: 2-Wire Interface C Periphery + "TWIC_TWIM", // 13: 2-Wire Interface C Controller + "TCC0_OVF", // 14: TC C0 Overflow + "TCC0_ERR", // 15: TC C0 Error + "TCC0_CCA", // 16: TC C0 Compare or Capture A + "TCC0_CCB", // 17: TC C0 Compare or Capture B + "TCC0_CCC", // 18: TC C0 Compare or Capture C + "TCC0_CCD", // 19: TC C0 Compare or Capture D + "TCC1_OVF", // 20: TC C1 Overflow + "TCC1_ERR", // 21: TC C1 Error + "TCC1_CCA", // 22: TC C1 Compare or Capture A + "TCC1_CCB", // 23: TC C1 Compare or Capture B + "SPIC_INT", // 24: SPI C Interrupt + "USARTC0_RXC", // 25: USARTC 0 Reception Complete + "USARTC0_DRE", // 26: USARTC 0 Data Register Empty + "USARTC0_TXC", // 27: USARTC 0 Transmission Complete + "USARTC1_RXC", // 28: USARTC 1 Reception Complete + "USARTC1_DRE", // 29: USARTC 1 Data Register Empty + "USARTC1_TXC", // 30: USARTC 1 Transmission Complete + "AES_INT", // 31: AES Interrupt + "NVM_EE", // 32: NVM EEPROM + "NVM_SPM", // 33: NVM SPM + "PORTB_INT0", // 34: External Interrupt 0 PORT B + "PORTB_INT1", // 35: External Interrupt 1 PORT B + "ACB_AC0", // 36: ACB AC 0 Interrupt + "ACB_AC1", // 37: ACB AC 1 Interrupt + "ACB_ACW", // 38: ACB AC Window Mode + "ADCB_CH0", // 39: ADCB Interrupt 0 + "ADCB_CH1", // 40: ADCB Interrupt 1 + "ADCB_CH2", // 41: ADCB Interrupt 2 + "ADCB_CH3", // 42: ADCB Interrupt 3 + "PORTE_INT0", // 43: External Interrupt 0 PORT E + "PORTE_INT1", // 44: External Interrupt 1 PORT E + "TWIE_TWIS", // 45: 2-Wire Interface E Periphery + "TWIE_TWIM", // 46: 2-Wire Interface E Controller + "TCE0_OVF", // 47: TC E0 Overflow + "TCE0_ERR", // 48: TC E0 Error + "TCE0_CCA", // 49: TC E0 Compare or Capture A + "TCE0_CCB", // 50: TC E0 Compare or Capture B + "TCE0_CCC", // 51: TC E0 Compare or Capture C + "TCE0_CCD", // 52: TC E0 Compare or Capture D + "TCE1_OVF", // 53: TC E1 Overflow + "TCE1_ERR", // 54: TC E1 Error + "TCE1_CCA", // 55: TC E1 Compare or Capture A + "TCE1_CCB", // 56: TC E1 Compare or Capture B + "SPIE_INT", // 57: SPI E Interrupt + "USARTE0_RXC", // 58: USARTE 0 Reception Complete + "USARTE0_DRE", // 59: USARTE 0 Data Register Empty + "USARTE0_TXC", // 60: USARTE 0 Transmission Complete + "USARTE1_RXC", // 61: USARTE 1 Reception Complete + "USARTE1_DRE", // 62: USARTE 1 Data Register Empty + "USARTE1_TXC", // 63: USARTE 1 Transmission Complete + "PORTD_INT0", // 64: External Interrupt 0 PORT D + "PORTD_INT1", // 65: External Interrupt 1 PORT D + "PORTA_INT0", // 66: External Interrupt 0 PORT A + "PORTA_INT1", // 67: External Interrupt 1 PORT A + "ACA_AC0", // 68: ACA AC 0 Interrupt + "ACA_AC1", // 69: ACA AC 1 Interrupt + "ACA_ACW", // 70: ACA AC Window Mode + "ADCA_CH0", // 71: ADCA Interrupt 0 + "ADCA_CH1", // 72: ADCA Interrupt 1 + "ADCA_CH2", // 73: ADCA Interrupt 2 + "ADCA_CH3", // 74: ADCA Interrupt 3 + "TWID_TWIS", // 75: 2-Wire Interface D Periphery + "TWID_TWIM", // 76: 2-Wire Interface D Controller + "TCD0_OVF", // 77: TC D0 Overflow + "TCD0_ERR", // 78: TC D0 Error + "TCD0_CCA", // 79: TC D0 Compare or Capture A + "TCD0_CCB", // 80: TC D0 Compare or Capture B + "TCD0_CCC", // 81: TC D0 Compare or Capture C + "TCD0_CCD", // 82: TC D0 Compare or Capture D + "TCD1_OVF", // 83: TC D1 Overflow + "TCD1_ERR", // 84: TC D1 Error + "TCD1_CCA", // 85: TC D1 Compare or Capture A + "TCD1_CCB", // 86: TC D1 Compare or Capture B + "SPID_INT", // 87: SPI D Interrupt + "USARTD0_RXC", // 88: USARTD 0 Reception Complete + "USARTD0_DRE", // 89: USARTD 0 Data Register Empty + "USARTD0_TXC", // 90: USARTD 0 Transmission Complete + "USARTD1_RXC", // 91: USARTD 1 Reception Complete + "USARTD1_DRE", // 92: USARTD 1 Data Register Empty + "USARTD1_TXC", // 93: USARTD 1 Transmission Complete + "PORTQ_INT0", // 94: External Interrupt 0 PORT Q + "PORTQ_INT1", // 95: External Interrupt 1 PORT Q + "PORTH_INT0", // 96: External Interrupt 0 PORT H + "PORTH_INT1", // 97: External Interrupt 1 PORT H + "PORTJ_INT0", // 98: External Interrupt 0 PORT J + "PORTJ_INT1", // 99: External Interrupt 1 PORT J + "PORTK_INT0", // 100: External Interrupt 0 PORT K + "PORTK_INT1", // 101: External Interrupt 1 PORT K + "UNUSED", // 102: not implemented on this device + "UNUSED", // 103: not implemented on this device + "PORTF_INT0", // 104: External Interrupt 0 PORT F + "PORTF_INT1", // 105: External Interrupt 1 PORT F + "TWIF_TWIS", // 106: 2-Wire Interface F Periphery + "TWIF_TWIM", // 107: 2-Wire Interface F Controller + "TCF0_OVF", // 108: TC F0 Overflow + "TCF0_ERR", // 109: TC F0 Error + "TCF0_CCA", // 110: TC F0 Compare or Capture A + "TCF0_CCB", // 111: TC F0 Compare or Capture B + "TCF0_CCC", // 112: TC F0 Compare or Capture C + "TCF0_CCD", // 113: TC F0 Compare or Capture D + "TCF1_OVF", // 114: TC F1 Overflow + "TCF1_ERR", // 115: TC F1 Error + "TCF1_CCA", // 116: TC F1 Compare or Capture A + "TCF1_CCB", // 117: TC F1 Compare or Capture B + "SPIF_INT", // 118: SPI F Interrupt + "USARTF0_RXC", // 119: USARTF 0 Reception Complete + "USARTF0_DRE", // 120: USARTF 0 Data Register Empty + "USARTF0_TXC", // 121: USARTF 0 Transmission Complete + "USARTF1_RXC", // 122: USARTF 1 Reception Complete + "USARTF1_DRE", // 123: USARTF 1 Data Register Empty + "USARTF1_TXC", // 124: USARTF 1 Transmission Complete +}; + +const char * const vtab_atxmega128a1u[vts_atxmega128a1u] = { // ATxmega128A1U, ATxmega64A1U + "RESET", // 0: Reset (various reasons) + "OSC_OSCF", // 1: Oscillator Failure NMI + "PORTC_INT0", // 2: External Interrupt 0 PORT C + "PORTC_INT1", // 3: External Interrupt 1 PORT C + "PORTR_INT0", // 4: External Interrupt 0 PORT R + "PORTR_INT1", // 5: External Interrupt 1 PORT R + "DMA_CH0", // 6: DMA Channel 0 + "DMA_CH1", // 7: DMA Channel 1 + "DMA_CH2", // 8: DMA Channel 2 + "DMA_CH3", // 9: DMA Channel 3 + "RTC_OVF", // 10: RTC Overflow + "RTC_COMP", // 11: RTC Compare + "TWIC_TWIS", // 12: 2-Wire Interface C Periphery + "TWIC_TWIM", // 13: 2-Wire Interface C Controller + "TCC0_OVF/TCC2_LUNF", // 14: TC C0 Overflow/TC C2 Low Byte Underflow + "TCC0_ERR/TCC2_HUNF", // 15: TC C0 Error/TC C2 High Byte Underflow + "TCC0_CCA/TCC2_LCMPA", // 16: TC C0 Compare or Capture A/TC C2 Low Byte Compare A + "TCC0_CCB/TCC2_LCMPB", // 17: TC C0 Compare or Capture B/TC C2 Low Byte Compare B + "TCC0_CCC/TCC2_LCMPC", // 18: TC C0 Compare or Capture C/TC C2 Low Byte Compare C + "TCC0_CCD/TCC2_LCMPD", // 19: TC C0 Compare or Capture D/TC C2 Low Byte Compare D + "TCC1_OVF", // 20: TC C1 Overflow + "TCC1_ERR", // 21: TC C1 Error + "TCC1_CCA", // 22: TC C1 Compare or Capture A + "TCC1_CCB", // 23: TC C1 Compare or Capture B + "SPIC_INT", // 24: SPI C Interrupt + "USARTC0_RXC", // 25: USARTC 0 Reception Complete + "USARTC0_DRE", // 26: USARTC 0 Data Register Empty + "USARTC0_TXC", // 27: USARTC 0 Transmission Complete + "USARTC1_RXC", // 28: USARTC 1 Reception Complete + "USARTC1_DRE", // 29: USARTC 1 Data Register Empty + "USARTC1_TXC", // 30: USARTC 1 Transmission Complete + "AES_INT", // 31: AES Interrupt + "NVM_EE", // 32: NVM EEPROM + "NVM_SPM", // 33: NVM SPM + "PORTB_INT0", // 34: External Interrupt 0 PORT B + "PORTB_INT1", // 35: External Interrupt 1 PORT B + "ACB_AC0", // 36: ACB AC 0 Interrupt + "ACB_AC1", // 37: ACB AC 1 Interrupt + "ACB_ACW", // 38: ACB AC Window Mode + "ADCB_CH0", // 39: ADCB Interrupt 0 + "ADCB_CH1", // 40: ADCB Interrupt 1 + "ADCB_CH2", // 41: ADCB Interrupt 2 + "ADCB_CH3", // 42: ADCB Interrupt 3 + "PORTE_INT0", // 43: External Interrupt 0 PORT E + "PORTE_INT1", // 44: External Interrupt 1 PORT E + "TWIE_TWIS", // 45: 2-Wire Interface E Periphery + "TWIE_TWIM", // 46: 2-Wire Interface E Controller + "TCE0_OVF/TCE2_LUNF", // 47: TC E0 Overflow/TC E2 Low Byte Underflow + "TCE0_ERR/TCE2_HUNF", // 48: TC E0 Error/TC E2 High Byte Underflow + "TCE0_CCA/TCE2_LCMPA", // 49: TC E0 Compare or Capture A/TC E2 Low Byte Compare A + "TCE0_CCB/TCE2_LCMPB", // 50: TC E0 Compare or Capture B/TC E2 Low Byte Compare B + "TCE0_CCC/TCE2_LCMPC", // 51: TC E0 Compare or Capture C/TC E2 Low Byte Compare C + "TCE0_CCD/TCE2_LCMPD", // 52: TC E0 Compare or Capture D/TC E2 Low Byte Compare D + "TCE1_OVF", // 53: TC E1 Overflow + "TCE1_ERR", // 54: TC E1 Error + "TCE1_CCA", // 55: TC E1 Compare or Capture A + "TCE1_CCB", // 56: TC E1 Compare or Capture B + "SPIE_INT", // 57: SPI E Interrupt + "USARTE0_RXC", // 58: USARTE 0 Reception Complete + "USARTE0_DRE", // 59: USARTE 0 Data Register Empty + "USARTE0_TXC", // 60: USARTE 0 Transmission Complete + "USARTE1_RXC", // 61: USARTE 1 Reception Complete + "USARTE1_DRE", // 62: USARTE 1 Data Register Empty + "USARTE1_TXC", // 63: USARTE 1 Transmission Complete + "PORTD_INT0", // 64: External Interrupt 0 PORT D + "PORTD_INT1", // 65: External Interrupt 1 PORT D + "PORTA_INT0", // 66: External Interrupt 0 PORT A + "PORTA_INT1", // 67: External Interrupt 1 PORT A + "ACA_AC0", // 68: ACA AC 0 Interrupt + "ACA_AC1", // 69: ACA AC 1 Interrupt + "ACA_ACW", // 70: ACA AC Window Mode + "ADCA_CH0", // 71: ADCA Interrupt 0 + "ADCA_CH1", // 72: ADCA Interrupt 1 + "ADCA_CH2", // 73: ADCA Interrupt 2 + "ADCA_CH3", // 74: ADCA Interrupt 3 + "TWID_TWIS", // 75: 2-Wire Interface D Periphery + "TWID_TWIM", // 76: 2-Wire Interface D Controller + "TCD0_OVF/TCD2_LUNF", // 77: TC D0 Overflow/TC D2 Low Byte Underflow + "TCD0_ERR/TCD2_HUNF", // 78: TC D0 Error/TC D2 High Byte Underflow + "TCD0_CCA/TCD2_LCMPA", // 79: TC D0 Compare or Capture A/TC D2 Low Byte Compare A + "TCD0_CCB/TCD2_LCMPB", // 80: TC D0 Compare or Capture B/TC D2 Low Byte Compare B + "TCD0_CCC/TCD2_LCMPC", // 81: TC D0 Compare or Capture C/TC D2 Low Byte Compare C + "TCD0_CCD/TCD2_LCMPD", // 82: TC D0 Compare or Capture D/TC D2 Low Byte Compare D + "TCD1_OVF", // 83: TC D1 Overflow + "TCD1_ERR", // 84: TC D1 Error + "TCD1_CCA", // 85: TC D1 Compare or Capture A + "TCD1_CCB", // 86: TC D1 Compare or Capture B + "SPID_INT", // 87: SPI D Interrupt + "USARTD0_RXC", // 88: USARTD 0 Reception Complete + "USARTD0_DRE", // 89: USARTD 0 Data Register Empty + "USARTD0_TXC", // 90: USARTD 0 Transmission Complete + "USARTD1_RXC", // 91: USARTD 1 Reception Complete + "USARTD1_DRE", // 92: USARTD 1 Data Register Empty + "USARTD1_TXC", // 93: USARTD 1 Transmission Complete + "PORTQ_INT0", // 94: External Interrupt 0 PORT Q + "PORTQ_INT1", // 95: External Interrupt 1 PORT Q + "PORTH_INT0", // 96: External Interrupt 0 PORT H + "PORTH_INT1", // 97: External Interrupt 1 PORT H + "PORTJ_INT0", // 98: External Interrupt 0 PORT J + "PORTJ_INT1", // 99: External Interrupt 1 PORT J + "PORTK_INT0", // 100: External Interrupt 0 PORT K + "PORTK_INT1", // 101: External Interrupt 1 PORT K + "UNUSED", // 102: not implemented on this device + "UNUSED", // 103: not implemented on this device + "PORTF_INT0", // 104: External Interrupt 0 PORT F + "PORTF_INT1", // 105: External Interrupt 1 PORT F + "TWIF_TWIS", // 106: 2-Wire Interface F Periphery + "TWIF_TWIM", // 107: 2-Wire Interface F Controller + "TCF0_OVF/TCF2_LUNF", // 108: TC F0 Overflow/TC F2 Low Byte Underflow + "TCF0_ERR/TCF2_HUNF", // 109: TC F0 Error/TC F2 High Byte Underflow + "TCF0_CCA/TCF2_LCMPA", // 110: TC F0 Compare or Capture A/TC F2 Low Byte Compare A + "TCF0_CCB/TCF2_LCMPB", // 111: TC F0 Compare or Capture B/TC F2 Low Byte Compare B + "TCF0_CCC/TCF2_LCMPC", // 112: TC F0 Compare or Capture C/TC F2 Low Byte Compare C + "TCF0_CCD/TCF2_LCMPD", // 113: TC F0 Compare or Capture D/TC F2 Low Byte Compare D + "TCF1_OVF", // 114: TC F1 Overflow + "TCF1_ERR", // 115: TC F1 Error + "TCF1_CCA", // 116: TC F1 Compare or Capture A + "TCF1_CCB", // 117: TC F1 Compare or Capture B + "SPIF_INT", // 118: SPI F Interrupt + "USARTF0_RXC", // 119: USARTF 0 Reception Complete + "USARTF0_DRE", // 120: USARTF 0 Data Register Empty + "USARTF0_TXC", // 121: USARTF 0 Transmission Complete + "USARTF1_RXC", // 122: USARTF 1 Reception Complete + "USARTF1_DRE", // 123: USARTF 1 Data Register Empty + "USARTF1_TXC", // 124: USARTF 1 Transmission Complete + "USB_BUSEVENT", // 125: SOF, Suspend, Resume, Reset Bus Event Interrupts, CRC, Underflow, Overflow or Stall Error + "USB_TRNCOMPL", // 126: USB Transaction Complete +}; + +const char * const vtab_atxmega128b1[vts_atxmega128b1] = { // ATxmega128B1, ATxmega64B1 + "RESET", // 0: Reset (various reasons) + "OSC_OSCF", // 1: Oscillator Failure NMI + "PORTC_INT0", // 2: External Interrupt 0 PORT C + "PORTC_INT1", // 3: External Interrupt 1 PORT C + "PORTR_INT0", // 4: External Interrupt 0 PORT R + "PORTR_INT1", // 5: External Interrupt 1 PORT R + "DMA_CH0", // 6: DMA Channel 0 + "DMA_CH1", // 7: DMA Channel 1 + "UNUSED", // 8: not implemented on this device + "UNUSED", // 9: not implemented on this device + "RTC_OVF", // 10: RTC Overflow + "RTC_COMP", // 11: RTC Compare + "TWIC_TWIS", // 12: 2-Wire Interface C Periphery + "TWIC_TWIM", // 13: 2-Wire Interface C Controller + "TCC0_OVF/TCC2_LUNF", // 14: TC C0 Overflow/TC C2 Low Byte Underflow + "TCC0_ERR/TCC2_HUNF", // 15: TC C0 Error/TC C2 High Byte Underflow + "TCC0_CCA/TCC2_LCMPA", // 16: TC C0 Compare or Capture A/TC C2 Low Byte Compare A + "TCC0_CCB/TCC2_LCMPB", // 17: TC C0 Compare or Capture B/TC C2 Low Byte Compare B + "TCC0_CCC/TCC2_LCMPC", // 18: TC C0 Compare or Capture C/TC C2 Low Byte Compare C + "TCC0_CCD/TCC2_LCMPD", // 19: TC C0 Compare or Capture D/TC C2 Low Byte Compare D + "TCC1_OVF", // 20: TC C1 Overflow + "TCC1_ERR", // 21: TC C1 Error + "TCC1_CCA", // 22: TC C1 Compare or Capture A + "TCC1_CCB", // 23: TC C1 Compare or Capture B + "SPIC_INT", // 24: SPI C Interrupt + "USARTC0_RXC", // 25: USARTC 0 Reception Complete + "USARTC0_DRE", // 26: USARTC 0 Data Register Empty + "USARTC0_TXC", // 27: USARTC 0 Transmission Complete + "UNUSED", // 28: not implemented on this device + "UNUSED", // 29: not implemented on this device + "UNUSED", // 30: not implemented on this device + "USB_BUSEVENT", // 31: SOF, Suspend, Resume, Reset Bus Event Interrupts, CRC, Underflow, Overflow or Stall Error + "USB_TRNCOMPL", // 32: USB Transaction Complete + "UNUSED", // 33: not implemented on this device + "UNUSED", // 34: not implemented on this device + "LCD_INT", // 35: LCD Interrupt + "AES_INT", // 36: AES Interrupt + "NVM_EE", // 37: NVM EEPROM + "NVM_SPM", // 38: NVM SPM + "PORTB_INT0", // 39: External Interrupt 0 PORT B + "PORTB_INT1", // 40: External Interrupt 1 PORT B + "ACB_AC0", // 41: ACB AC 0 Interrupt + "ACB_AC1", // 42: ACB AC 1 Interrupt + "ACB_ACW", // 43: ACB AC Window Mode + "ADCB_CH0", // 44: ADCB Interrupt 0 + "UNUSED", // 45: not implemented on this device + "UNUSED", // 46: not implemented on this device + "UNUSED", // 47: not implemented on this device + "PORTD_INT0", // 48: External Interrupt 0 PORT D + "PORTD_INT1", // 49: External Interrupt 1 PORT D + "PORTG_INT0", // 50: External Interrupt 0 PORT G + "PORTG_INT1", // 51: External Interrupt 1 PORT G + "PORTM_INT0", // 52: External Interrupt 0 PORT M + "PORTM_INT1", // 53: External Interrupt 1 PORT M + "PORTE_INT0", // 54: External Interrupt 0 PORT E + "PORTE_INT1", // 55: External Interrupt 1 PORT E + "UNUSED", // 56: not implemented on this device + "UNUSED", // 57: not implemented on this device + "TCE0_OVF/TCE2_LUNF", // 58: TC E0 Overflow/TC E2 Low Byte Underflow + "TCE0_ERR/TCE2_HUNF", // 59: TC E0 Error/TC E2 High Byte Underflow + "TCE0_CCA/TCE2_LCMPA", // 60: TC E0 Compare or Capture A/TC E2 Low Byte Compare A + "TCE0_CCB/TCE2_LCMPB", // 61: TC E0 Compare or Capture B/TC E2 Low Byte Compare B + "TCE0_CCC/TCE2_LCMPC", // 62: TC E0 Compare or Capture C/TC E2 Low Byte Compare C + "TCE0_CCD/TCE2_LCMPD", // 63: TC E0 Compare or Capture D/TC E2 Low Byte Compare D + "UNUSED", // 64: not implemented on this device + "UNUSED", // 65: not implemented on this device + "UNUSED", // 66: not implemented on this device + "UNUSED", // 67: not implemented on this device + "UNUSED", // 68: not implemented on this device + "USARTE0_RXC", // 69: USARTE 0 Reception Complete + "USARTE0_DRE", // 70: USARTE 0 Data Register Empty + "USARTE0_TXC", // 71: USARTE 0 Transmission Complete + "UNUSED", // 72: not implemented on this device + "UNUSED", // 73: not implemented on this device + "UNUSED", // 74: not implemented on this device + "PORTA_INT0", // 75: External Interrupt 0 PORT A + "PORTA_INT1", // 76: External Interrupt 1 PORT A + "ACA_AC0", // 77: ACA AC 0 Interrupt + "ACA_AC1", // 78: ACA AC 1 Interrupt + "ACA_ACW", // 79: ACA AC Window Mode + "ADCA_CH0", // 80: ADCA Interrupt 0 +}; + +const char * const vtab_atxmega128b3[vts_atxmega128b3] = { // ATxmega128B3, ATxmega64B3 + "RESET", // 0: Reset (various reasons) + "OSC_OSCF", // 1: Oscillator Failure NMI + "PORTC_INT0", // 2: External Interrupt 0 PORT C + "PORTC_INT1", // 3: External Interrupt 1 PORT C + "PORTR_INT0", // 4: External Interrupt 0 PORT R + "PORTR_INT1", // 5: External Interrupt 1 PORT R + "DMA_CH0", // 6: DMA Channel 0 + "DMA_CH1", // 7: DMA Channel 1 + "UNUSED", // 8: not implemented on this device + "UNUSED", // 9: not implemented on this device + "RTC_OVF", // 10: RTC Overflow + "RTC_COMP", // 11: RTC Compare + "TWIC_TWIS", // 12: 2-Wire Interface C Periphery + "TWIC_TWIM", // 13: 2-Wire Interface C Controller + "TCC0_OVF/TCC2_LUNF", // 14: TC C0 Overflow/TC C2 Low Byte Underflow + "TCC0_ERR/TCC2_HUNF", // 15: TC C0 Error/TC C2 High Byte Underflow + "TCC0_CCA/TCC2_LCMPA", // 16: TC C0 Compare or Capture A/TC C2 Low Byte Compare A + "TCC0_CCB/TCC2_LCMPB", // 17: TC C0 Compare or Capture B/TC C2 Low Byte Compare B + "TCC0_CCC/TCC2_LCMPC", // 18: TC C0 Compare or Capture C/TC C2 Low Byte Compare C + "TCC0_CCD/TCC2_LCMPD", // 19: TC C0 Compare or Capture D/TC C2 Low Byte Compare D + "TCC1_OVF", // 20: TC C1 Overflow + "TCC1_ERR", // 21: TC C1 Error + "TCC1_CCA", // 22: TC C1 Compare or Capture A + "TCC1_CCB", // 23: TC C1 Compare or Capture B + "SPIC_INT", // 24: SPI C Interrupt + "USARTC0_RXC", // 25: USARTC 0 Reception Complete + "USARTC0_DRE", // 26: USARTC 0 Data Register Empty + "USARTC0_TXC", // 27: USARTC 0 Transmission Complete + "UNUSED", // 28: not implemented on this device + "UNUSED", // 29: not implemented on this device + "UNUSED", // 30: not implemented on this device + "USB_BUSEVENT", // 31: SOF, Suspend, Resume, Reset Bus Event Interrupts, CRC, Underflow, Overflow or Stall Error + "USB_TRNCOMPL", // 32: USB Transaction Complete + "UNUSED", // 33: not implemented on this device + "UNUSED", // 34: not implemented on this device + "LCD_INT", // 35: LCD Interrupt + "AES_INT", // 36: AES Interrupt + "NVM_EE", // 37: NVM EEPROM + "NVM_SPM", // 38: NVM SPM + "PORTB_INT0", // 39: External Interrupt 0 PORT B + "PORTB_INT1", // 40: External Interrupt 1 PORT B + "ACB_AC0", // 41: ACB AC 0 Interrupt + "ACB_AC1", // 42: ACB AC 1 Interrupt + "ACB_ACW", // 43: ACB AC Window Mode + "ADCB_CH0", // 44: ADCB Interrupt 0 + "UNUSED", // 45: not implemented on this device + "UNUSED", // 46: not implemented on this device + "UNUSED", // 47: not implemented on this device + "PORTD_INT0", // 48: External Interrupt 0 PORT D + "PORTD_INT1", // 49: External Interrupt 1 PORT D + "PORTG_INT0", // 50: External Interrupt 0 PORT G + "PORTG_INT1", // 51: External Interrupt 1 PORT G + "PORTM_INT0", // 52: External Interrupt 0 PORT M + "PORTM_INT1", // 53: External Interrupt 1 PORT M +}; + +const char * const vtab_atxmega128a4u[vts_atxmega128a4u] = { // ATxmega128A4U, ATxmega64A4U, ATxmega32A4U, ATxmega16A4U + "RESET", // 0: Reset (various reasons) + "OSC_OSCF", // 1: Oscillator Failure NMI + "PORTC_INT0", // 2: External Interrupt 0 PORT C + "PORTC_INT1", // 3: External Interrupt 1 PORT C + "PORTR_INT0", // 4: External Interrupt 0 PORT R + "PORTR_INT1", // 5: External Interrupt 1 PORT R + "DMA_CH0", // 6: DMA Channel 0 + "DMA_CH1", // 7: DMA Channel 1 + "DMA_CH2", // 8: DMA Channel 2 + "DMA_CH3", // 9: DMA Channel 3 + "RTC_OVF", // 10: RTC Overflow + "RTC_COMP", // 11: RTC Compare + "TWIC_TWIS", // 12: 2-Wire Interface C Periphery + "TWIC_TWIM", // 13: 2-Wire Interface C Controller + "TCC0_OVF/TCC2_LUNF", // 14: TC C0 Overflow/TC C2 Low Byte Underflow + "TCC0_ERR/TCC2_HUNF", // 15: TC C0 Error/TC C2 High Byte Underflow + "TCC0_CCA/TCC2_LCMPA", // 16: TC C0 Compare or Capture A/TC C2 Low Byte Compare A + "TCC0_CCB/TCC2_LCMPB", // 17: TC C0 Compare or Capture B/TC C2 Low Byte Compare B + "TCC0_CCC/TCC2_LCMPC", // 18: TC C0 Compare or Capture C/TC C2 Low Byte Compare C + "TCC0_CCD/TCC2_LCMPD", // 19: TC C0 Compare or Capture D/TC C2 Low Byte Compare D + "TCC1_OVF", // 20: TC C1 Overflow + "TCC1_ERR", // 21: TC C1 Error + "TCC1_CCA", // 22: TC C1 Compare or Capture A + "TCC1_CCB", // 23: TC C1 Compare or Capture B + "SPIC_INT", // 24: SPI C Interrupt + "USARTC0_RXC", // 25: USARTC 0 Reception Complete + "USARTC0_DRE", // 26: USARTC 0 Data Register Empty + "USARTC0_TXC", // 27: USARTC 0 Transmission Complete + "USARTC1_RXC", // 28: USARTC 1 Reception Complete + "USARTC1_DRE", // 29: USARTC 1 Data Register Empty + "USARTC1_TXC", // 30: USARTC 1 Transmission Complete + "AES_INT", // 31: AES Interrupt + "NVM_EE", // 32: NVM EEPROM + "NVM_SPM", // 33: NVM SPM + "PORTB_INT0", // 34: External Interrupt 0 PORT B + "PORTB_INT1", // 35: External Interrupt 1 PORT B + "UNUSED", // 36: not implemented on this device + "UNUSED", // 37: not implemented on this device + "UNUSED", // 38: not implemented on this device + "UNUSED", // 39: not implemented on this device + "UNUSED", // 40: not implemented on this device + "UNUSED", // 41: not implemented on this device + "UNUSED", // 42: not implemented on this device + "PORTE_INT0", // 43: External Interrupt 0 PORT E + "PORTE_INT1", // 44: External Interrupt 1 PORT E + "TWIE_TWIS", // 45: 2-Wire Interface E Periphery + "TWIE_TWIM", // 46: 2-Wire Interface E Controller + "TCE0_OVF", // 47: TC E0 Overflow + "TCE0_ERR", // 48: TC E0 Error + "TCE0_CCA", // 49: TC E0 Compare or Capture A + "TCE0_CCB", // 50: TC E0 Compare or Capture B + "TCE0_CCC", // 51: TC E0 Compare or Capture C + "TCE0_CCD", // 52: TC E0 Compare or Capture D + "UNUSED", // 53: not implemented on this device + "UNUSED", // 54: not implemented on this device + "UNUSED", // 55: not implemented on this device + "UNUSED", // 56: not implemented on this device + "UNUSED", // 57: not implemented on this device + "USARTE0_RXC", // 58: USARTE 0 Reception Complete + "USARTE0_DRE", // 59: USARTE 0 Data Register Empty + "USARTE0_TXC", // 60: USARTE 0 Transmission Complete + "UNUSED", // 61: not implemented on this device + "UNUSED", // 62: not implemented on this device + "UNUSED", // 63: not implemented on this device + "PORTD_INT0", // 64: External Interrupt 0 PORT D + "PORTD_INT1", // 65: External Interrupt 1 PORT D + "PORTA_INT0", // 66: External Interrupt 0 PORT A + "PORTA_INT1", // 67: External Interrupt 1 PORT A + "ACA_AC0", // 68: ACA AC 0 Interrupt + "ACA_AC1", // 69: ACA AC 1 Interrupt + "ACA_ACW", // 70: ACA AC Window Mode + "ADCA_CH0", // 71: ADCA Interrupt 0 + "ADCA_CH1", // 72: ADCA Interrupt 1 + "ADCA_CH2", // 73: ADCA Interrupt 2 + "ADCA_CH3", // 74: ADCA Interrupt 3 + "UNUSED", // 75: not implemented on this device + "UNUSED", // 76: not implemented on this device + "TCD0_OVF/TCD2_LUNF", // 77: TC D0 Overflow/TC D2 Low Byte Underflow + "TCD0_ERR/TCD2_HUNF", // 78: TC D0 Error/TC D2 High Byte Underflow + "TCD0_CCA/TCD2_LCMPA", // 79: TC D0 Compare or Capture A/TC D2 Low Byte Compare A + "TCD0_CCB/TCD2_LCMPB", // 80: TC D0 Compare or Capture B/TC D2 Low Byte Compare B + "TCD0_CCC/TCD2_LCMPC", // 81: TC D0 Compare or Capture C/TC D2 Low Byte Compare C + "TCD0_CCD/TCD2_LCMPD", // 82: TC D0 Compare or Capture D/TC D2 Low Byte Compare D + "TCD1_OVF", // 83: TC D1 Overflow + "TCD1_ERR", // 84: TC D1 Error + "TCD1_CCA", // 85: TC D1 Compare or Capture A + "TCD1_CCB", // 86: TC D1 Compare or Capture B + "SPID_INT", // 87: SPI D Interrupt + "USARTD0_RXC", // 88: USARTD 0 Reception Complete + "USARTD0_DRE", // 89: USARTD 0 Data Register Empty + "USARTD0_TXC", // 90: USARTD 0 Transmission Complete + "USARTD1_RXC", // 91: USARTD 1 Reception Complete + "USARTD1_DRE", // 92: USARTD 1 Data Register Empty + "USARTD1_TXC", // 93: USARTD 1 Transmission Complete + "UNUSED", // 94: not implemented on this device + "UNUSED", // 95: not implemented on this device + "UNUSED", // 96: not implemented on this device + "UNUSED", // 97: not implemented on this device + "UNUSED", // 98: not implemented on this device + "UNUSED", // 99: not implemented on this device + "UNUSED", // 100: not implemented on this device + "UNUSED", // 101: not implemented on this device + "UNUSED", // 102: not implemented on this device + "UNUSED", // 103: not implemented on this device + "UNUSED", // 104: not implemented on this device + "UNUSED", // 105: not implemented on this device + "UNUSED", // 106: not implemented on this device + "UNUSED", // 107: not implemented on this device + "UNUSED", // 108: not implemented on this device + "UNUSED", // 109: not implemented on this device + "UNUSED", // 110: not implemented on this device + "UNUSED", // 111: not implemented on this device + "UNUSED", // 112: not implemented on this device + "UNUSED", // 113: not implemented on this device + "UNUSED", // 114: not implemented on this device + "UNUSED", // 115: not implemented on this device + "UNUSED", // 116: not implemented on this device + "UNUSED", // 117: not implemented on this device + "UNUSED", // 118: not implemented on this device + "UNUSED", // 119: not implemented on this device + "UNUSED", // 120: not implemented on this device + "UNUSED", // 121: not implemented on this device + "UNUSED", // 122: not implemented on this device + "UNUSED", // 123: not implemented on this device + "UNUSED", // 124: not implemented on this device + "USB_BUSEVENT", // 125: SOF, Suspend, Resume, Reset Bus Event Interrupts, CRC, Underflow, Overflow or Stall Error + "USB_TRNCOMPL", // 126: USB Transaction Complete +}; + +const char * const vtab_atxmega128d4[vts_atxmega128d4] = { // ATxmega128D4, ATxmega64D4 + "RESET", // 0: Reset (various reasons) + "OSC_OSCF", // 1: Oscillator Failure NMI + "PORTC_INT0", // 2: External Interrupt 0 PORT C + "PORTC_INT1", // 3: External Interrupt 1 PORT C + "PORTR_INT0", // 4: External Interrupt 0 PORT R + "PORTR_INT1", // 5: External Interrupt 1 PORT R + "UNUSED", // 6: not implemented on this device + "UNUSED", // 7: not implemented on this device + "UNUSED", // 8: not implemented on this device + "UNUSED", // 9: not implemented on this device + "RTC_OVF", // 10: RTC Overflow + "RTC_COMP", // 11: RTC Compare + "TWIC_TWIS", // 12: 2-Wire Interface C Periphery + "TWIC_TWIM", // 13: 2-Wire Interface C Controller + "TCC0_OVF/TCC2_LUNF", // 14: TC C0 Overflow/TC C2 Low Byte Underflow + "TCC0_ERR/TCC2_HUNF", // 15: TC C0 Error/TC C2 High Byte Underflow + "TCC0_CCA/TCC2_LCMPA", // 16: TC C0 Compare or Capture A/TC C2 Low Byte Compare A + "TCC0_CCB/TCC2_LCMPB", // 17: TC C0 Compare or Capture B/TC C2 Low Byte Compare B + "TCC0_CCC/TCC2_LCMPC", // 18: TC C0 Compare or Capture C/TC C2 Low Byte Compare C + "TCC0_CCD/TCC2_LCMPD", // 19: TC C0 Compare or Capture D/TC C2 Low Byte Compare D + "TCC1_OVF", // 20: TC C1 Overflow + "TCC1_ERR", // 21: TC C1 Error + "TCC1_CCA", // 22: TC C1 Compare or Capture A + "TCC1_CCB", // 23: TC C1 Compare or Capture B + "SPIC_INT", // 24: SPI C Interrupt + "USARTC0_RXC", // 25: USARTC 0 Reception Complete + "USARTC0_DRE", // 26: USARTC 0 Data Register Empty + "USARTC0_TXC", // 27: USARTC 0 Transmission Complete + "UNUSED", // 28: not implemented on this device + "UNUSED", // 29: not implemented on this device + "UNUSED", // 30: not implemented on this device + "UNUSED", // 31: not implemented on this device + "NVM_EE", // 32: NVM EEPROM + "NVM_SPM", // 33: NVM SPM + "PORTB_INT0", // 34: External Interrupt 0 PORT B + "PORTB_INT1", // 35: External Interrupt 1 PORT B + "UNUSED", // 36: not implemented on this device + "UNUSED", // 37: not implemented on this device + "UNUSED", // 38: not implemented on this device + "UNUSED", // 39: not implemented on this device + "UNUSED", // 40: not implemented on this device + "UNUSED", // 41: not implemented on this device + "UNUSED", // 42: not implemented on this device + "PORTE_INT0", // 43: External Interrupt 0 PORT E + "PORTE_INT1", // 44: External Interrupt 1 PORT E + "TWIE_TWIS", // 45: 2-Wire Interface E Periphery + "TWIE_TWIM", // 46: 2-Wire Interface E Controller + "TCE0_OVF", // 47: TC E0 Overflow + "TCE0_ERR", // 48: TC E0 Error + "TCE0_CCA", // 49: TC E0 Compare or Capture A + "TCE0_CCB", // 50: TC E0 Compare or Capture B + "TCE0_CCC", // 51: TC E0 Compare or Capture C + "TCE0_CCD", // 52: TC E0 Compare or Capture D + "UNUSED", // 53: not implemented on this device + "UNUSED", // 54: not implemented on this device + "UNUSED", // 55: not implemented on this device + "UNUSED", // 56: not implemented on this device + "UNUSED", // 57: not implemented on this device + "USARTE0_RXC", // 58: USARTE 0 Reception Complete + "USARTE0_DRE", // 59: USARTE 0 Data Register Empty + "USARTE0_TXC", // 60: USARTE 0 Transmission Complete + "UNUSED", // 61: not implemented on this device + "UNUSED", // 62: not implemented on this device + "UNUSED", // 63: not implemented on this device + "PORTD_INT0", // 64: External Interrupt 0 PORT D + "PORTD_INT1", // 65: External Interrupt 1 PORT D + "PORTA_INT0", // 66: External Interrupt 0 PORT A + "PORTA_INT1", // 67: External Interrupt 1 PORT A + "ACA_AC0", // 68: ACA AC 0 Interrupt + "ACA_AC1", // 69: ACA AC 1 Interrupt + "ACA_ACW", // 70: ACA AC Window Mode + "ADCA_CH0", // 71: ADCA Interrupt 0 + "UNUSED", // 72: not implemented on this device + "UNUSED", // 73: not implemented on this device + "UNUSED", // 74: not implemented on this device + "UNUSED", // 75: not implemented on this device + "UNUSED", // 76: not implemented on this device + "TCD0_OVF/TCD2_LUNF", // 77: TC D0 Overflow/TC D2 Low Byte Underflow + "TCD0_ERR/TCD2_HUNF", // 78: TC D0 Error/TC D2 High Byte Underflow + "TCD0_CCA/TCD2_LCMPA", // 79: TC D0 Compare or Capture A/TC D2 Low Byte Compare A + "TCD0_CCB/TCD2_LCMPB", // 80: TC D0 Compare or Capture B/TC D2 Low Byte Compare B + "TCD0_CCC/TCD2_LCMPC", // 81: TC D0 Compare or Capture C/TC D2 Low Byte Compare C + "TCD0_CCD/TCD2_LCMPD", // 82: TC D0 Compare or Capture D/TC D2 Low Byte Compare D + "UNUSED", // 83: not implemented on this device + "UNUSED", // 84: not implemented on this device + "UNUSED", // 85: not implemented on this device + "UNUSED", // 86: not implemented on this device + "SPID_INT", // 87: SPI D Interrupt + "USARTD0_RXC", // 88: USARTD 0 Reception Complete + "USARTD0_DRE", // 89: USARTD 0 Data Register Empty + "USARTD0_TXC", // 90: USARTD 0 Transmission Complete +}; + +const char * const vtab_atxmega256a3[vts_atxmega256a3] = { // ATxmega256A3, ATxmega192A3, ATxmega128A3, ATxmega64A3 + "RESET", // 0: Reset (various reasons) + "OSC_OSCF", // 1: Oscillator Failure NMI + "PORTC_INT0", // 2: External Interrupt 0 PORT C + "PORTC_INT1", // 3: External Interrupt 1 PORT C + "PORTR_INT0", // 4: External Interrupt 0 PORT R + "PORTR_INT1", // 5: External Interrupt 1 PORT R + "DMA_CH0", // 6: DMA Channel 0 + "DMA_CH1", // 7: DMA Channel 1 + "DMA_CH2", // 8: DMA Channel 2 + "DMA_CH3", // 9: DMA Channel 3 + "RTC_OVF", // 10: RTC Overflow + "RTC_COMP", // 11: RTC Compare + "TWIC_TWIS", // 12: 2-Wire Interface C Periphery + "TWIC_TWIM", // 13: 2-Wire Interface C Controller + "TCC0_OVF", // 14: TC C0 Overflow + "TCC0_ERR", // 15: TC C0 Error + "TCC0_CCA", // 16: TC C0 Compare or Capture A + "TCC0_CCB", // 17: TC C0 Compare or Capture B + "TCC0_CCC", // 18: TC C0 Compare or Capture C + "TCC0_CCD", // 19: TC C0 Compare or Capture D + "TCC1_OVF", // 20: TC C1 Overflow + "TCC1_ERR", // 21: TC C1 Error + "TCC1_CCA", // 22: TC C1 Compare or Capture A + "TCC1_CCB", // 23: TC C1 Compare or Capture B + "SPIC_INT", // 24: SPI C Interrupt + "USARTC0_RXC", // 25: USARTC 0 Reception Complete + "USARTC0_DRE", // 26: USARTC 0 Data Register Empty + "USARTC0_TXC", // 27: USARTC 0 Transmission Complete + "USARTC1_RXC", // 28: USARTC 1 Reception Complete + "USARTC1_DRE", // 29: USARTC 1 Data Register Empty + "USARTC1_TXC", // 30: USARTC 1 Transmission Complete + "AES_INT", // 31: AES Interrupt + "NVM_EE", // 32: NVM EEPROM + "NVM_SPM", // 33: NVM SPM + "PORTB_INT0", // 34: External Interrupt 0 PORT B + "PORTB_INT1", // 35: External Interrupt 1 PORT B + "ACB_AC0", // 36: ACB AC 0 Interrupt + "ACB_AC1", // 37: ACB AC 1 Interrupt + "ACB_ACW", // 38: ACB AC Window Mode + "ADCB_CH0", // 39: ADCB Interrupt 0 + "ADCB_CH1", // 40: ADCB Interrupt 1 + "ADCB_CH2", // 41: ADCB Interrupt 2 + "ADCB_CH3", // 42: ADCB Interrupt 3 + "PORTE_INT0", // 43: External Interrupt 0 PORT E + "PORTE_INT1", // 44: External Interrupt 1 PORT E + "TWIE_TWIS", // 45: 2-Wire Interface E Periphery + "TWIE_TWIM", // 46: 2-Wire Interface E Controller + "TCE0_OVF", // 47: TC E0 Overflow + "TCE0_ERR", // 48: TC E0 Error + "TCE0_CCA", // 49: TC E0 Compare or Capture A + "TCE0_CCB", // 50: TC E0 Compare or Capture B + "TCE0_CCC", // 51: TC E0 Compare or Capture C + "TCE0_CCD", // 52: TC E0 Compare or Capture D + "TCE1_OVF", // 53: TC E1 Overflow + "TCE1_ERR", // 54: TC E1 Error + "TCE1_CCA", // 55: TC E1 Compare or Capture A + "TCE1_CCB", // 56: TC E1 Compare or Capture B + "SPIE_INT", // 57: SPI E Interrupt + "USARTE0_RXC", // 58: USARTE 0 Reception Complete + "USARTE0_DRE", // 59: USARTE 0 Data Register Empty + "USARTE0_TXC", // 60: USARTE 0 Transmission Complete + "USARTE1_RXC", // 61: USARTE 1 Reception Complete + "USARTE1_DRE", // 62: USARTE 1 Data Register Empty + "USARTE1_TXC", // 63: USARTE 1 Transmission Complete + "PORTD_INT0", // 64: External Interrupt 0 PORT D + "PORTD_INT1", // 65: External Interrupt 1 PORT D + "PORTA_INT0", // 66: External Interrupt 0 PORT A + "PORTA_INT1", // 67: External Interrupt 1 PORT A + "ACA_AC0", // 68: ACA AC 0 Interrupt + "ACA_AC1", // 69: ACA AC 1 Interrupt + "ACA_ACW", // 70: ACA AC Window Mode + "ADCA_CH0", // 71: ADCA Interrupt 0 + "ADCA_CH1", // 72: ADCA Interrupt 1 + "ADCA_CH2", // 73: ADCA Interrupt 2 + "ADCA_CH3", // 74: ADCA Interrupt 3 + "UNUSED", // 75: not implemented on this device + "UNUSED", // 76: not implemented on this device + "TCD0_OVF", // 77: TC D0 Overflow + "TCD0_ERR", // 78: TC D0 Error + "TCD0_CCA", // 79: TC D0 Compare or Capture A + "TCD0_CCB", // 80: TC D0 Compare or Capture B + "TCD0_CCC", // 81: TC D0 Compare or Capture C + "TCD0_CCD", // 82: TC D0 Compare or Capture D + "TCD1_OVF", // 83: TC D1 Overflow + "TCD1_ERR", // 84: TC D1 Error + "TCD1_CCA", // 85: TC D1 Compare or Capture A + "TCD1_CCB", // 86: TC D1 Compare or Capture B + "SPID_INT", // 87: SPI D Interrupt + "USARTD0_RXC", // 88: USARTD 0 Reception Complete + "USARTD0_DRE", // 89: USARTD 0 Data Register Empty + "USARTD0_TXC", // 90: USARTD 0 Transmission Complete + "USARTD1_RXC", // 91: USARTD 1 Reception Complete + "USARTD1_DRE", // 92: USARTD 1 Data Register Empty + "USARTD1_TXC", // 93: USARTD 1 Transmission Complete + "UNUSED", // 94: not implemented on this device + "UNUSED", // 95: not implemented on this device + "UNUSED", // 96: not implemented on this device + "UNUSED", // 97: not implemented on this device + "UNUSED", // 98: not implemented on this device + "UNUSED", // 99: not implemented on this device + "UNUSED", // 100: not implemented on this device + "UNUSED", // 101: not implemented on this device + "UNUSED", // 102: not implemented on this device + "UNUSED", // 103: not implemented on this device + "PORTF_INT0", // 104: External Interrupt 0 PORT F + "PORTF_INT1", // 105: External Interrupt 1 PORT F + "UNUSED", // 106: not implemented on this device + "UNUSED", // 107: not implemented on this device + "TCF0_OVF", // 108: TC F0 Overflow + "TCF0_ERR", // 109: TC F0 Error + "TCF0_CCA", // 110: TC F0 Compare or Capture A + "TCF0_CCB", // 111: TC F0 Compare or Capture B + "TCF0_CCC", // 112: TC F0 Compare or Capture C + "TCF0_CCD", // 113: TC F0 Compare or Capture D + "UNUSED", // 114: not implemented on this device + "UNUSED", // 115: not implemented on this device + "UNUSED", // 116: not implemented on this device + "UNUSED", // 117: not implemented on this device + "UNUSED", // 118: not implemented on this device + "USARTF0_RXC", // 119: USARTF 0 Reception Complete + "USARTF0_DRE", // 120: USARTF 0 Data Register Empty + "USARTF0_TXC", // 121: USARTF 0 Transmission Complete +}; + +const char * const vtab_atxmega256a3b[vts_atxmega256a3b] = { // ATxmega256A3B + "RESET", // 0: Reset (various reasons) + "OSC_OSCF", // 1: Oscillator Failure NMI + "PORTC_INT0", // 2: External Interrupt 0 PORT C + "PORTC_INT1", // 3: External Interrupt 1 PORT C + "PORTR_INT0", // 4: External Interrupt 0 PORT R + "PORTR_INT1", // 5: External Interrupt 1 PORT R + "DMA_CH0", // 6: DMA Channel 0 + "DMA_CH1", // 7: DMA Channel 1 + "DMA_CH2", // 8: DMA Channel 2 + "DMA_CH3", // 9: DMA Channel 3 + "RTC32_OVF", // 10: RTC32 Overflow + "RTC32_COMP", // 11: RTC32 Compare + "TWIC_TWIS", // 12: 2-Wire Interface C Periphery + "TWIC_TWIM", // 13: 2-Wire Interface C Controller + "TCC0_OVF", // 14: TC C0 Overflow + "TCC0_ERR", // 15: TC C0 Error + "TCC0_CCA", // 16: TC C0 Compare or Capture A + "TCC0_CCB", // 17: TC C0 Compare or Capture B + "TCC0_CCC", // 18: TC C0 Compare or Capture C + "TCC0_CCD", // 19: TC C0 Compare or Capture D + "TCC1_OVF", // 20: TC C1 Overflow + "TCC1_ERR", // 21: TC C1 Error + "TCC1_CCA", // 22: TC C1 Compare or Capture A + "TCC1_CCB", // 23: TC C1 Compare or Capture B + "SPIC_INT", // 24: SPI C Interrupt + "USARTC0_RXC", // 25: USARTC 0 Reception Complete + "USARTC0_DRE", // 26: USARTC 0 Data Register Empty + "USARTC0_TXC", // 27: USARTC 0 Transmission Complete + "USARTC1_RXC", // 28: USARTC 1 Reception Complete + "USARTC1_DRE", // 29: USARTC 1 Data Register Empty + "USARTC1_TXC", // 30: USARTC 1 Transmission Complete + "AES_INT", // 31: AES Interrupt + "NVM_EE", // 32: NVM EEPROM + "NVM_SPM", // 33: NVM SPM + "PORTB_INT0", // 34: External Interrupt 0 PORT B + "PORTB_INT1", // 35: External Interrupt 1 PORT B + "ACB_AC0", // 36: ACB AC 0 Interrupt + "ACB_AC1", // 37: ACB AC 1 Interrupt + "ACB_ACW", // 38: ACB AC Window Mode + "ADCB_CH0", // 39: ADCB Interrupt 0 + "ADCB_CH1", // 40: ADCB Interrupt 1 + "ADCB_CH2", // 41: ADCB Interrupt 2 + "ADCB_CH3", // 42: ADCB Interrupt 3 + "PORTE_INT0", // 43: External Interrupt 0 PORT E + "PORTE_INT1", // 44: External Interrupt 1 PORT E + "TWIE_TWIS", // 45: 2-Wire Interface E Periphery + "TWIE_TWIM", // 46: 2-Wire Interface E Controller + "TCE0_OVF", // 47: TC E0 Overflow + "TCE0_ERR", // 48: TC E0 Error + "TCE0_CCA", // 49: TC E0 Compare or Capture A + "TCE0_CCB", // 50: TC E0 Compare or Capture B + "TCE0_CCC", // 51: TC E0 Compare or Capture C + "TCE0_CCD", // 52: TC E0 Compare or Capture D + "TCE1_OVF", // 53: TC E1 Overflow + "TCE1_ERR", // 54: TC E1 Error + "TCE1_CCA", // 55: TC E1 Compare or Capture A + "TCE1_CCB", // 56: TC E1 Compare or Capture B + "UNUSED", // 57: not implemented on this device + "USARTE0_RXC", // 58: USARTE 0 Reception Complete + "USARTE0_DRE", // 59: USARTE 0 Data Register Empty + "USARTE0_TXC", // 60: USARTE 0 Transmission Complete + "UNUSED", // 61: not implemented on this device + "UNUSED", // 62: not implemented on this device + "UNUSED", // 63: not implemented on this device + "PORTD_INT0", // 64: External Interrupt 0 PORT D + "PORTD_INT1", // 65: External Interrupt 1 PORT D + "PORTA_INT0", // 66: External Interrupt 0 PORT A + "PORTA_INT1", // 67: External Interrupt 1 PORT A + "ACA_AC0", // 68: ACA AC 0 Interrupt + "ACA_AC1", // 69: ACA AC 1 Interrupt + "ACA_ACW", // 70: ACA AC Window Mode + "ADCA_CH0", // 71: ADCA Interrupt 0 + "ADCA_CH1", // 72: ADCA Interrupt 1 + "ADCA_CH2", // 73: ADCA Interrupt 2 + "ADCA_CH3", // 74: ADCA Interrupt 3 + "UNUSED", // 75: not implemented on this device + "UNUSED", // 76: not implemented on this device + "TCD0_OVF", // 77: TC D0 Overflow + "TCD0_ERR", // 78: TC D0 Error + "TCD0_CCA", // 79: TC D0 Compare or Capture A + "TCD0_CCB", // 80: TC D0 Compare or Capture B + "TCD0_CCC", // 81: TC D0 Compare or Capture C + "TCD0_CCD", // 82: TC D0 Compare or Capture D + "TCD1_OVF", // 83: TC D1 Overflow + "TCD1_ERR", // 84: TC D1 Error + "TCD1_CCA", // 85: TC D1 Compare or Capture A + "TCD1_CCB", // 86: TC D1 Compare or Capture B + "SPID_INT", // 87: SPI D Interrupt + "USARTD0_RXC", // 88: USARTD 0 Reception Complete + "USARTD0_DRE", // 89: USARTD 0 Data Register Empty + "USARTD0_TXC", // 90: USARTD 0 Transmission Complete + "USARTD1_RXC", // 91: USARTD 1 Reception Complete + "USARTD1_DRE", // 92: USARTD 1 Data Register Empty + "USARTD1_TXC", // 93: USARTD 1 Transmission Complete + "UNUSED", // 94: not implemented on this device + "UNUSED", // 95: not implemented on this device + "UNUSED", // 96: not implemented on this device + "UNUSED", // 97: not implemented on this device + "UNUSED", // 98: not implemented on this device + "UNUSED", // 99: not implemented on this device + "UNUSED", // 100: not implemented on this device + "UNUSED", // 101: not implemented on this device + "UNUSED", // 102: not implemented on this device + "UNUSED", // 103: not implemented on this device + "PORTF_INT0", // 104: External Interrupt 0 PORT F + "PORTF_INT1", // 105: External Interrupt 1 PORT F + "UNUSED", // 106: not implemented on this device + "UNUSED", // 107: not implemented on this device + "TCF0_OVF", // 108: TC F0 Overflow + "TCF0_ERR", // 109: TC F0 Error + "TCF0_CCA", // 110: TC F0 Compare or Capture A + "TCF0_CCB", // 111: TC F0 Compare or Capture B + "TCF0_CCC", // 112: TC F0 Compare or Capture C + "TCF0_CCD", // 113: TC F0 Compare or Capture D + "UNUSED", // 114: not implemented on this device + "UNUSED", // 115: not implemented on this device + "UNUSED", // 116: not implemented on this device + "UNUSED", // 117: not implemented on this device + "UNUSED", // 118: not implemented on this device + "USARTF0_RXC", // 119: USARTF 0 Reception Complete + "USARTF0_DRE", // 120: USARTF 0 Data Register Empty + "USARTF0_TXC", // 121: USARTF 0 Transmission Complete +}; + +const char * const vtab_atxmega256a3bu[vts_atxmega256a3bu] = { // ATxmega256A3BU + "RESET", // 0: Reset (various reasons) + "OSC_OSCF", // 1: Oscillator Failure NMI + "PORTC_INT0", // 2: External Interrupt 0 PORT C + "PORTC_INT1", // 3: External Interrupt 1 PORT C + "PORTR_INT0", // 4: External Interrupt 0 PORT R + "PORTR_INT1", // 5: External Interrupt 1 PORT R + "DMA_CH0", // 6: DMA Channel 0 + "DMA_CH1", // 7: DMA Channel 1 + "DMA_CH2", // 8: DMA Channel 2 + "DMA_CH3", // 9: DMA Channel 3 + "RTC32_OVF", // 10: RTC32 Overflow + "RTC32_COMP", // 11: RTC32 Compare + "TWIC_TWIS", // 12: 2-Wire Interface C Periphery + "TWIC_TWIM", // 13: 2-Wire Interface C Controller + "TCC0_OVF/TCC2_LUNF", // 14: TC C0 Overflow/TC C2 Low Byte Underflow + "TCC0_ERR/TCC2_HUNF", // 15: TC C0 Error/TC C2 High Byte Underflow + "TCC0_CCA/TCC2_LCMPA", // 16: TC C0 Compare or Capture A/TC C2 Low Byte Compare A + "TCC0_CCB/TCC2_LCMPB", // 17: TC C0 Compare or Capture B/TC C2 Low Byte Compare B + "TCC0_CCC/TCC2_LCMPC", // 18: TC C0 Compare or Capture C/TC C2 Low Byte Compare C + "TCC0_CCD/TCC2_LCMPD", // 19: TC C0 Compare or Capture D/TC C2 Low Byte Compare D + "TCC1_OVF", // 20: TC C1 Overflow + "TCC1_ERR", // 21: TC C1 Error + "TCC1_CCA", // 22: TC C1 Compare or Capture A + "TCC1_CCB", // 23: TC C1 Compare or Capture B + "SPIC_INT", // 24: SPI C Interrupt + "USARTC0_RXC", // 25: USARTC 0 Reception Complete + "USARTC0_DRE", // 26: USARTC 0 Data Register Empty + "USARTC0_TXC", // 27: USARTC 0 Transmission Complete + "USARTC1_RXC", // 28: USARTC 1 Reception Complete + "USARTC1_DRE", // 29: USARTC 1 Data Register Empty + "USARTC1_TXC", // 30: USARTC 1 Transmission Complete + "AES_INT", // 31: AES Interrupt + "NVM_EE", // 32: NVM EEPROM + "NVM_SPM", // 33: NVM SPM + "PORTB_INT0", // 34: External Interrupt 0 PORT B + "PORTB_INT1", // 35: External Interrupt 1 PORT B + "ACB_AC0", // 36: ACB AC 0 Interrupt + "ACB_AC1", // 37: ACB AC 1 Interrupt + "ACB_ACW", // 38: ACB AC Window Mode + "ADCB_CH0", // 39: ADCB Interrupt 0 + "ADCB_CH1", // 40: ADCB Interrupt 1 + "ADCB_CH2", // 41: ADCB Interrupt 2 + "ADCB_CH3", // 42: ADCB Interrupt 3 + "PORTE_INT0", // 43: External Interrupt 0 PORT E + "PORTE_INT1", // 44: External Interrupt 1 PORT E + "TWIE_TWIS", // 45: 2-Wire Interface E Periphery + "TWIE_TWIM", // 46: 2-Wire Interface E Controller + "TCE0_OVF/TCE2_LUNF", // 47: TC E0 Overflow/TC E2 Low Byte Underflow + "TCE0_ERR/TCE2_HUNF", // 48: TC E0 Error/TC E2 High Byte Underflow + "TCE0_CCA/TCE2_LCMPA", // 49: TC E0 Compare or Capture A/TC E2 Low Byte Compare A + "TCE0_CCB/TCE2_LCMPB", // 50: TC E0 Compare or Capture B/TC E2 Low Byte Compare B + "TCE0_CCC/TCE2_LCMPC", // 51: TC E0 Compare or Capture C/TC E2 Low Byte Compare C + "TCE0_CCD/TCE2_LCMPD", // 52: TC E0 Compare or Capture D/TC E2 Low Byte Compare D + "TCE1_OVF", // 53: TC E1 Overflow + "TCE1_ERR", // 54: TC E1 Error + "TCE1_CCA", // 55: TC E1 Compare or Capture A + "TCE1_CCB", // 56: TC E1 Compare or Capture B + "UNUSED", // 57: not implemented on this device + "USARTE0_RXC", // 58: USARTE 0 Reception Complete + "USARTE0_DRE", // 59: USARTE 0 Data Register Empty + "USARTE0_TXC", // 60: USARTE 0 Transmission Complete + "UNUSED", // 61: not implemented on this device + "UNUSED", // 62: not implemented on this device + "UNUSED", // 63: not implemented on this device + "PORTD_INT0", // 64: External Interrupt 0 PORT D + "PORTD_INT1", // 65: External Interrupt 1 PORT D + "PORTA_INT0", // 66: External Interrupt 0 PORT A + "PORTA_INT1", // 67: External Interrupt 1 PORT A + "ACA_AC0", // 68: ACA AC 0 Interrupt + "ACA_AC1", // 69: ACA AC 1 Interrupt + "ACA_ACW", // 70: ACA AC Window Mode + "ADCA_CH0", // 71: ADCA Interrupt 0 + "ADCA_CH1", // 72: ADCA Interrupt 1 + "ADCA_CH2", // 73: ADCA Interrupt 2 + "ADCA_CH3", // 74: ADCA Interrupt 3 + "UNUSED", // 75: not implemented on this device + "UNUSED", // 76: not implemented on this device + "TCD0_OVF/TCD2_LUNF", // 77: TC D0 Overflow/TC D2 Low Byte Underflow + "TCD0_ERR/TCD2_HUNF", // 78: TC D0 Error/TC D2 High Byte Underflow + "TCD0_CCA/TCD2_LCMPA", // 79: TC D0 Compare or Capture A/TC D2 Low Byte Compare A + "TCD0_CCB/TCD2_LCMPB", // 80: TC D0 Compare or Capture B/TC D2 Low Byte Compare B + "TCD0_CCC/TCD2_LCMPC", // 81: TC D0 Compare or Capture C/TC D2 Low Byte Compare C + "TCD0_CCD/TCD2_LCMPD", // 82: TC D0 Compare or Capture D/TC D2 Low Byte Compare D + "TCD1_OVF", // 83: TC D1 Overflow + "TCD1_ERR", // 84: TC D1 Error + "TCD1_CCA", // 85: TC D1 Compare or Capture A + "TCD1_CCB", // 86: TC D1 Compare or Capture B + "SPID_INT", // 87: SPI D Interrupt + "USARTD0_RXC", // 88: USARTD 0 Reception Complete + "USARTD0_DRE", // 89: USARTD 0 Data Register Empty + "USARTD0_TXC", // 90: USARTD 0 Transmission Complete + "USARTD1_RXC", // 91: USARTD 1 Reception Complete + "USARTD1_DRE", // 92: USARTD 1 Data Register Empty + "USARTD1_TXC", // 93: USARTD 1 Transmission Complete + "UNUSED", // 94: not implemented on this device + "UNUSED", // 95: not implemented on this device + "UNUSED", // 96: not implemented on this device + "UNUSED", // 97: not implemented on this device + "UNUSED", // 98: not implemented on this device + "UNUSED", // 99: not implemented on this device + "UNUSED", // 100: not implemented on this device + "UNUSED", // 101: not implemented on this device + "UNUSED", // 102: not implemented on this device + "UNUSED", // 103: not implemented on this device + "PORTF_INT0", // 104: External Interrupt 0 PORT F + "PORTF_INT1", // 105: External Interrupt 1 PORT F + "UNUSED", // 106: not implemented on this device + "UNUSED", // 107: not implemented on this device + "TCF0_OVF/TCF2_LUNF", // 108: TC F0 Overflow/TC F2 Low Byte Underflow + "TCF0_ERR/TCF2_HUNF", // 109: TC F0 Error/TC F2 High Byte Underflow + "TCF0_CCA/TCF2_LCMPA", // 110: TC F0 Compare or Capture A/TC F2 Low Byte Compare A + "TCF0_CCB/TCF2_LCMPB", // 111: TC F0 Compare or Capture B/TC F2 Low Byte Compare B + "TCF0_CCC/TCF2_LCMPC", // 112: TC F0 Compare or Capture C/TC F2 Low Byte Compare C + "TCF0_CCD/TCF2_LCMPD", // 113: TC F0 Compare or Capture D/TC F2 Low Byte Compare D + "UNUSED", // 114: not implemented on this device + "UNUSED", // 115: not implemented on this device + "UNUSED", // 116: not implemented on this device + "UNUSED", // 117: not implemented on this device + "UNUSED", // 118: not implemented on this device + "USARTF0_RXC", // 119: USARTF 0 Reception Complete + "USARTF0_DRE", // 120: USARTF 0 Data Register Empty + "USARTF0_TXC", // 121: USARTF 0 Transmission Complete + "UNUSED", // 122: not implemented on this device + "UNUSED", // 123: not implemented on this device + "UNUSED", // 124: not implemented on this device + "USB_BUSEVENT", // 125: SOF, Suspend, Resume, Reset Bus Event Interrupts, CRC, Underflow, Overflow or Stall Error + "USB_TRNCOMPL", // 126: USB Transaction Complete +}; + +const char * const vtab_atxmega256a3u[vts_atxmega256a3u] = { // ATxmega256A3U, ATxmega192A3U, ATxmega128A3U, ATxmega64A3U + "RESET", // 0: Reset (various reasons) + "OSC_OSCF", // 1: Oscillator Failure NMI + "PORTC_INT0", // 2: External Interrupt 0 PORT C + "PORTC_INT1", // 3: External Interrupt 1 PORT C + "PORTR_INT0", // 4: External Interrupt 0 PORT R + "PORTR_INT1", // 5: External Interrupt 1 PORT R + "DMA_CH0", // 6: DMA Channel 0 + "DMA_CH1", // 7: DMA Channel 1 + "DMA_CH2", // 8: DMA Channel 2 + "DMA_CH3", // 9: DMA Channel 3 + "RTC_OVF", // 10: RTC Overflow + "RTC_COMP", // 11: RTC Compare + "TWIC_TWIS", // 12: 2-Wire Interface C Periphery + "TWIC_TWIM", // 13: 2-Wire Interface C Controller + "TCC0_OVF/TCC2_LUNF", // 14: TC C0 Overflow/TC C2 Low Byte Underflow + "TCC0_ERR/TCC2_HUNF", // 15: TC C0 Error/TC C2 High Byte Underflow + "TCC0_CCA/TCC2_LCMPA", // 16: TC C0 Compare or Capture A/TC C2 Low Byte Compare A + "TCC0_CCB/TCC2_LCMPB", // 17: TC C0 Compare or Capture B/TC C2 Low Byte Compare B + "TCC0_CCC/TCC2_LCMPC", // 18: TC C0 Compare or Capture C/TC C2 Low Byte Compare C + "TCC0_CCD/TCC2_LCMPD", // 19: TC C0 Compare or Capture D/TC C2 Low Byte Compare D + "TCC1_OVF", // 20: TC C1 Overflow + "TCC1_ERR", // 21: TC C1 Error + "TCC1_CCA", // 22: TC C1 Compare or Capture A + "TCC1_CCB", // 23: TC C1 Compare or Capture B + "SPIC_INT", // 24: SPI C Interrupt + "USARTC0_RXC", // 25: USARTC 0 Reception Complete + "USARTC0_DRE", // 26: USARTC 0 Data Register Empty + "USARTC0_TXC", // 27: USARTC 0 Transmission Complete + "USARTC1_RXC", // 28: USARTC 1 Reception Complete + "USARTC1_DRE", // 29: USARTC 1 Data Register Empty + "USARTC1_TXC", // 30: USARTC 1 Transmission Complete + "AES_INT", // 31: AES Interrupt + "NVM_EE", // 32: NVM EEPROM + "NVM_SPM", // 33: NVM SPM + "PORTB_INT0", // 34: External Interrupt 0 PORT B + "PORTB_INT1", // 35: External Interrupt 1 PORT B + "ACB_AC0", // 36: ACB AC 0 Interrupt + "ACB_AC1", // 37: ACB AC 1 Interrupt + "ACB_ACW", // 38: ACB AC Window Mode + "ADCB_CH0", // 39: ADCB Interrupt 0 + "ADCB_CH1", // 40: ADCB Interrupt 1 + "ADCB_CH2", // 41: ADCB Interrupt 2 + "ADCB_CH3", // 42: ADCB Interrupt 3 + "PORTE_INT0", // 43: External Interrupt 0 PORT E + "PORTE_INT1", // 44: External Interrupt 1 PORT E + "TWIE_TWIS", // 45: 2-Wire Interface E Periphery + "TWIE_TWIM", // 46: 2-Wire Interface E Controller + "TCE0_OVF/TCE2_LUNF", // 47: TC E0 Overflow/TC E2 Low Byte Underflow + "TCE0_ERR/TCE2_HUNF", // 48: TC E0 Error/TC E2 High Byte Underflow + "TCE0_CCA/TCE2_LCMPA", // 49: TC E0 Compare or Capture A/TC E2 Low Byte Compare A + "TCE0_CCB/TCE2_LCMPB", // 50: TC E0 Compare or Capture B/TC E2 Low Byte Compare B + "TCE0_CCC/TCE2_LCMPC", // 51: TC E0 Compare or Capture C/TC E2 Low Byte Compare C + "TCE0_CCD/TCE2_LCMPD", // 52: TC E0 Compare or Capture D/TC E2 Low Byte Compare D + "TCE1_OVF", // 53: TC E1 Overflow + "TCE1_ERR", // 54: TC E1 Error + "TCE1_CCA", // 55: TC E1 Compare or Capture A + "TCE1_CCB", // 56: TC E1 Compare or Capture B + "SPIE_INT", // 57: SPI E Interrupt + "USARTE0_RXC", // 58: USARTE 0 Reception Complete + "USARTE0_DRE", // 59: USARTE 0 Data Register Empty + "USARTE0_TXC", // 60: USARTE 0 Transmission Complete + "USARTE1_RXC", // 61: USARTE 1 Reception Complete + "USARTE1_DRE", // 62: USARTE 1 Data Register Empty + "USARTE1_TXC", // 63: USARTE 1 Transmission Complete + "PORTD_INT0", // 64: External Interrupt 0 PORT D + "PORTD_INT1", // 65: External Interrupt 1 PORT D + "PORTA_INT0", // 66: External Interrupt 0 PORT A + "PORTA_INT1", // 67: External Interrupt 1 PORT A + "ACA_AC0", // 68: ACA AC 0 Interrupt + "ACA_AC1", // 69: ACA AC 1 Interrupt + "ACA_ACW", // 70: ACA AC Window Mode + "ADCA_CH0", // 71: ADCA Interrupt 0 + "ADCA_CH1", // 72: ADCA Interrupt 1 + "ADCA_CH2", // 73: ADCA Interrupt 2 + "ADCA_CH3", // 74: ADCA Interrupt 3 + "UNUSED", // 75: not implemented on this device + "UNUSED", // 76: not implemented on this device + "TCD0_OVF/TCD2_LUNF", // 77: TC D0 Overflow/TC D2 Low Byte Underflow + "TCD0_ERR/TCD2_HUNF", // 78: TC D0 Error/TC D2 High Byte Underflow + "TCD0_CCA/TCD2_LCMPA", // 79: TC D0 Compare or Capture A/TC D2 Low Byte Compare A + "TCD0_CCB/TCD2_LCMPB", // 80: TC D0 Compare or Capture B/TC D2 Low Byte Compare B + "TCD0_CCC/TCD2_LCMPC", // 81: TC D0 Compare or Capture C/TC D2 Low Byte Compare C + "TCD0_CCD/TCD2_LCMPD", // 82: TC D0 Compare or Capture D/TC D2 Low Byte Compare D + "TCD1_OVF", // 83: TC D1 Overflow + "TCD1_ERR", // 84: TC D1 Error + "TCD1_CCA", // 85: TC D1 Compare or Capture A + "TCD1_CCB", // 86: TC D1 Compare or Capture B + "SPID_INT", // 87: SPI D Interrupt + "USARTD0_RXC", // 88: USARTD 0 Reception Complete + "USARTD0_DRE", // 89: USARTD 0 Data Register Empty + "USARTD0_TXC", // 90: USARTD 0 Transmission Complete + "USARTD1_RXC", // 91: USARTD 1 Reception Complete + "USARTD1_DRE", // 92: USARTD 1 Data Register Empty + "USARTD1_TXC", // 93: USARTD 1 Transmission Complete + "UNUSED", // 94: not implemented on this device + "UNUSED", // 95: not implemented on this device + "UNUSED", // 96: not implemented on this device + "UNUSED", // 97: not implemented on this device + "UNUSED", // 98: not implemented on this device + "UNUSED", // 99: not implemented on this device + "UNUSED", // 100: not implemented on this device + "UNUSED", // 101: not implemented on this device + "UNUSED", // 102: not implemented on this device + "UNUSED", // 103: not implemented on this device + "PORTF_INT0", // 104: External Interrupt 0 PORT F + "PORTF_INT1", // 105: External Interrupt 1 PORT F + "UNUSED", // 106: not implemented on this device + "UNUSED", // 107: not implemented on this device + "TCF0_OVF/TCF2_LUNF", // 108: TC F0 Overflow/TC F2 Low Byte Underflow + "TCF0_ERR/TCF2_HUNF", // 109: TC F0 Error/TC F2 High Byte Underflow + "TCF0_CCA/TCF2_LCMPA", // 110: TC F0 Compare or Capture A/TC F2 Low Byte Compare A + "TCF0_CCB/TCF2_LCMPB", // 111: TC F0 Compare or Capture B/TC F2 Low Byte Compare B + "TCF0_CCC/TCF2_LCMPC", // 112: TC F0 Compare or Capture C/TC F2 Low Byte Compare C + "TCF0_CCD/TCF2_LCMPD", // 113: TC F0 Compare or Capture D/TC F2 Low Byte Compare D + "UNUSED", // 114: not implemented on this device + "UNUSED", // 115: not implemented on this device + "UNUSED", // 116: not implemented on this device + "UNUSED", // 117: not implemented on this device + "UNUSED", // 118: not implemented on this device + "USARTF0_RXC", // 119: USARTF 0 Reception Complete + "USARTF0_DRE", // 120: USARTF 0 Data Register Empty + "USARTF0_TXC", // 121: USARTF 0 Transmission Complete + "UNUSED", // 122: not implemented on this device + "UNUSED", // 123: not implemented on this device + "UNUSED", // 124: not implemented on this device + "USB_BUSEVENT", // 125: SOF, Suspend, Resume, Reset Bus Event Interrupts, CRC, Underflow, Overflow or Stall Error + "USB_TRNCOMPL", // 126: USB Transaction Complete +}; + +const char * const vtab_atxmega256c3[vts_atxmega256c3] = { // ATxmega256C3, ATxmega192C3, ATxmega128C3, ATxmega64C3, ATxmega32C3 + "RESET", // 0: Reset (various reasons) + "OSC_OSCF", // 1: Oscillator Failure NMI + "PORTC_INT0", // 2: External Interrupt 0 PORT C + "PORTC_INT1", // 3: External Interrupt 1 PORT C + "PORTR_INT0", // 4: External Interrupt 0 PORT R + "PORTR_INT1", // 5: External Interrupt 1 PORT R + "UNUSED", // 6: not implemented on this device + "UNUSED", // 7: not implemented on this device + "UNUSED", // 8: not implemented on this device + "UNUSED", // 9: not implemented on this device + "RTC_OVF", // 10: RTC Overflow + "RTC_COMP", // 11: RTC Compare + "TWIC_TWIS", // 12: 2-Wire Interface C Periphery + "TWIC_TWIM", // 13: 2-Wire Interface C Controller + "TCC0_OVF/TCC2_LUNF", // 14: TC C0 Overflow/TC C2 Low Byte Underflow + "TCC0_ERR/TCC2_HUNF", // 15: TC C0 Error/TC C2 High Byte Underflow + "TCC0_CCA/TCC2_LCMPA", // 16: TC C0 Compare or Capture A/TC C2 Low Byte Compare A + "TCC0_CCB/TCC2_LCMPB", // 17: TC C0 Compare or Capture B/TC C2 Low Byte Compare B + "TCC0_CCC/TCC2_LCMPC", // 18: TC C0 Compare or Capture C/TC C2 Low Byte Compare C + "TCC0_CCD/TCC2_LCMPD", // 19: TC C0 Compare or Capture D/TC C2 Low Byte Compare D + "TCC1_OVF", // 20: TC C1 Overflow + "TCC1_ERR", // 21: TC C1 Error + "TCC1_CCA", // 22: TC C1 Compare or Capture A + "TCC1_CCB", // 23: TC C1 Compare or Capture B + "SPIC_INT", // 24: SPI C Interrupt + "USARTC0_RXC", // 25: USARTC 0 Reception Complete + "USARTC0_DRE", // 26: USARTC 0 Data Register Empty + "USARTC0_TXC", // 27: USARTC 0 Transmission Complete + "UNUSED", // 28: not implemented on this device + "UNUSED", // 29: not implemented on this device + "UNUSED", // 30: not implemented on this device + "UNUSED", // 31: not implemented on this device + "NVM_EE", // 32: NVM EEPROM + "NVM_SPM", // 33: NVM SPM + "PORTB_INT0", // 34: External Interrupt 0 PORT B + "PORTB_INT1", // 35: External Interrupt 1 PORT B + "UNUSED", // 36: not implemented on this device + "UNUSED", // 37: not implemented on this device + "UNUSED", // 38: not implemented on this device + "UNUSED", // 39: not implemented on this device + "UNUSED", // 40: not implemented on this device + "UNUSED", // 41: not implemented on this device + "UNUSED", // 42: not implemented on this device + "PORTE_INT0", // 43: External Interrupt 0 PORT E + "PORTE_INT1", // 44: External Interrupt 1 PORT E + "TWIE_TWIS", // 45: 2-Wire Interface E Periphery + "TWIE_TWIM", // 46: 2-Wire Interface E Controller + "TCE0_OVF/TCE2_LUNF", // 47: TC E0 Overflow/TC E2 Low Byte Underflow + "TCE0_ERR/TCE2_HUNF", // 48: TC E0 Error/TC E2 High Byte Underflow + "TCE0_CCA/TCE2_LCMPA", // 49: TC E0 Compare or Capture A/TC E2 Low Byte Compare A + "TCE0_CCB/TCE2_LCMPB", // 50: TC E0 Compare or Capture B/TC E2 Low Byte Compare B + "TCE0_CCC/TCE2_LCMPC", // 51: TC E0 Compare or Capture C/TC E2 Low Byte Compare C + "TCE0_CCD/TCE2_LCMPD", // 52: TC E0 Compare or Capture D/TC E2 Low Byte Compare D + "UNUSED", // 53: not implemented on this device + "UNUSED", // 54: not implemented on this device + "UNUSED", // 55: not implemented on this device + "UNUSED", // 56: not implemented on this device + "UNUSED", // 57: not implemented on this device + "USARTE0_RXC", // 58: USARTE 0 Reception Complete + "USARTE0_DRE", // 59: USARTE 0 Data Register Empty + "USARTE0_TXC", // 60: USARTE 0 Transmission Complete + "UNUSED", // 61: not implemented on this device + "UNUSED", // 62: not implemented on this device + "UNUSED", // 63: not implemented on this device + "PORTD_INT0", // 64: External Interrupt 0 PORT D + "PORTD_INT1", // 65: External Interrupt 1 PORT D + "PORTA_INT0", // 66: External Interrupt 0 PORT A + "PORTA_INT1", // 67: External Interrupt 1 PORT A + "ACA_AC0", // 68: ACA AC 0 Interrupt + "ACA_AC1", // 69: ACA AC 1 Interrupt + "ACA_ACW", // 70: ACA AC Window Mode + "ADCA_CH0", // 71: ADCA Interrupt 0 + "UNUSED", // 72: not implemented on this device + "UNUSED", // 73: not implemented on this device + "UNUSED", // 74: not implemented on this device + "UNUSED", // 75: not implemented on this device + "UNUSED", // 76: not implemented on this device + "TCD0_OVF/TCD2_LUNF", // 77: TC D0 Overflow/TC D2 Low Byte Underflow + "TCD0_ERR/TCD2_HUNF", // 78: TC D0 Error/TC D2 High Byte Underflow + "TCD0_CCA/TCD2_LCMPA", // 79: TC D0 Compare or Capture A/TC D2 Low Byte Compare A + "TCD0_CCB/TCD2_LCMPB", // 80: TC D0 Compare or Capture B/TC D2 Low Byte Compare B + "TCD0_CCC/TCD2_LCMPC", // 81: TC D0 Compare or Capture C/TC D2 Low Byte Compare C + "TCD0_CCD/TCD2_LCMPD", // 82: TC D0 Compare or Capture D/TC D2 Low Byte Compare D + "UNUSED", // 83: not implemented on this device + "UNUSED", // 84: not implemented on this device + "UNUSED", // 85: not implemented on this device + "UNUSED", // 86: not implemented on this device + "SPID_INT", // 87: SPI D Interrupt + "USARTD0_RXC", // 88: USARTD 0 Reception Complete + "USARTD0_DRE", // 89: USARTD 0 Data Register Empty + "USARTD0_TXC", // 90: USARTD 0 Transmission Complete + "UNUSED", // 91: not implemented on this device + "UNUSED", // 92: not implemented on this device + "UNUSED", // 93: not implemented on this device + "UNUSED", // 94: not implemented on this device + "UNUSED", // 95: not implemented on this device + "UNUSED", // 96: not implemented on this device + "UNUSED", // 97: not implemented on this device + "UNUSED", // 98: not implemented on this device + "UNUSED", // 99: not implemented on this device + "UNUSED", // 100: not implemented on this device + "UNUSED", // 101: not implemented on this device + "UNUSED", // 102: not implemented on this device + "UNUSED", // 103: not implemented on this device + "PORTF_INT0", // 104: External Interrupt 0 PORT F + "PORTF_INT1", // 105: External Interrupt 1 PORT F + "UNUSED", // 106: not implemented on this device + "UNUSED", // 107: not implemented on this device + "TCF0_OVF/TCF2_LUNF", // 108: TC F0 Overflow/TC F2 Low Byte Underflow + "TCF0_ERR/TCF2_HUNF", // 109: TC F0 Error/TC F2 High Byte Underflow + "TCF0_CCA/TCF2_LCMPA", // 110: TC F0 Compare or Capture A/TC F2 Low Byte Compare A + "TCF0_CCB/TCF2_LCMPB", // 111: TC F0 Compare or Capture B/TC F2 Low Byte Compare B + "TCF0_CCC/TCF2_LCMPC", // 112: TC F0 Compare or Capture C/TC F2 Low Byte Compare C + "TCF0_CCD/TCF2_LCMPD", // 113: TC F0 Compare or Capture D/TC F2 Low Byte Compare D + "UNUSED", // 114: not implemented on this device + "UNUSED", // 115: not implemented on this device + "UNUSED", // 116: not implemented on this device + "UNUSED", // 117: not implemented on this device + "UNUSED", // 118: not implemented on this device + "UNUSED", // 119: not implemented on this device + "UNUSED", // 120: not implemented on this device + "UNUSED", // 121: not implemented on this device + "UNUSED", // 122: not implemented on this device + "UNUSED", // 123: not implemented on this device + "UNUSED", // 124: not implemented on this device + "USB_BUSEVENT", // 125: SOF, Suspend, Resume, Reset Bus Event Interrupts, CRC, Underflow, Overflow or Stall Error + "USB_TRNCOMPL", // 126: USB Transaction Complete +}; + +const char * const vtab_atxmega384c3[vts_atxmega384c3] = { // ATxmega384C3 + "RESET", // 0: Reset (various reasons) + "OSC_OSCF", // 1: Oscillator Failure NMI + "PORTC_INT0", // 2: External Interrupt 0 PORT C + "PORTC_INT1", // 3: External Interrupt 1 PORT C + "PORTR_INT0", // 4: External Interrupt 0 PORT R + "PORTR_INT1", // 5: External Interrupt 1 PORT R + "DMA_CH0", // 6: DMA Channel 0 + "DMA_CH1", // 7: DMA Channel 1 + "UNUSED", // 8: not implemented on this device + "UNUSED", // 9: not implemented on this device + "RTC_OVF", // 10: RTC Overflow + "RTC_COMP", // 11: RTC Compare + "TWIC_TWIS", // 12: 2-Wire Interface C Periphery + "TWIC_TWIM", // 13: 2-Wire Interface C Controller + "TCC0_OVF/TCC2_LUNF", // 14: TC C0 Overflow/TC C2 Low Byte Underflow + "TCC0_ERR/TCC2_HUNF", // 15: TC C0 Error/TC C2 High Byte Underflow + "TCC0_CCA/TCC2_LCMPA", // 16: TC C0 Compare or Capture A/TC C2 Low Byte Compare A + "TCC0_CCB/TCC2_LCMPB", // 17: TC C0 Compare or Capture B/TC C2 Low Byte Compare B + "TCC0_CCC/TCC2_LCMPC", // 18: TC C0 Compare or Capture C/TC C2 Low Byte Compare C + "TCC0_CCD/TCC2_LCMPD", // 19: TC C0 Compare or Capture D/TC C2 Low Byte Compare D + "TCC1_OVF", // 20: TC C1 Overflow + "TCC1_ERR", // 21: TC C1 Error + "TCC1_CCA", // 22: TC C1 Compare or Capture A + "TCC1_CCB", // 23: TC C1 Compare or Capture B + "SPIC_INT", // 24: SPI C Interrupt + "USARTC0_RXC", // 25: USARTC 0 Reception Complete + "USARTC0_DRE", // 26: USARTC 0 Data Register Empty + "USARTC0_TXC", // 27: USARTC 0 Transmission Complete + "USARTC1_RXC", // 28: USARTC 1 Reception Complete + "USARTC1_DRE", // 29: USARTC 1 Data Register Empty + "USARTC1_TXC", // 30: USARTC 1 Transmission Complete + "AES_INT", // 31: AES Interrupt + "NVM_EE", // 32: NVM EEPROM + "NVM_SPM", // 33: NVM SPM + "PORTB_INT0", // 34: External Interrupt 0 PORT B + "PORTB_INT1", // 35: External Interrupt 1 PORT B + "UNUSED", // 36: not implemented on this device + "UNUSED", // 37: not implemented on this device + "UNUSED", // 38: not implemented on this device + "UNUSED", // 39: not implemented on this device + "UNUSED", // 40: not implemented on this device + "UNUSED", // 41: not implemented on this device + "UNUSED", // 42: not implemented on this device + "PORTE_INT0", // 43: External Interrupt 0 PORT E + "PORTE_INT1", // 44: External Interrupt 1 PORT E + "TWIE_TWIS", // 45: 2-Wire Interface E Periphery + "TWIE_TWIM", // 46: 2-Wire Interface E Controller + "TCE0_OVF/TCE2_LUNF", // 47: TC E0 Overflow/TC E2 Low Byte Underflow + "TCE0_ERR/TCE2_HUNF", // 48: TC E0 Error/TC E2 High Byte Underflow + "TCE0_CCA/TCE2_LCMPA", // 49: TC E0 Compare or Capture A/TC E2 Low Byte Compare A + "TCE0_CCB/TCE2_LCMPB", // 50: TC E0 Compare or Capture B/TC E2 Low Byte Compare B + "TCE0_CCC/TCE2_LCMPC", // 51: TC E0 Compare or Capture C/TC E2 Low Byte Compare C + "TCE0_CCD/TCE2_LCMPD", // 52: TC E0 Compare or Capture D/TC E2 Low Byte Compare D + "UNUSED", // 53: not implemented on this device + "UNUSED", // 54: not implemented on this device + "UNUSED", // 55: not implemented on this device + "UNUSED", // 56: not implemented on this device + "UNUSED", // 57: not implemented on this device + "USARTE0_RXC", // 58: USARTE 0 Reception Complete + "USARTE0_DRE", // 59: USARTE 0 Data Register Empty + "USARTE0_TXC", // 60: USARTE 0 Transmission Complete + "UNUSED", // 61: not implemented on this device + "UNUSED", // 62: not implemented on this device + "UNUSED", // 63: not implemented on this device + "PORTD_INT0", // 64: External Interrupt 0 PORT D + "PORTD_INT1", // 65: External Interrupt 1 PORT D + "PORTA_INT0", // 66: External Interrupt 0 PORT A + "PORTA_INT1", // 67: External Interrupt 1 PORT A + "ACA_AC0", // 68: ACA AC 0 Interrupt + "ACA_AC1", // 69: ACA AC 1 Interrupt + "ACA_ACW", // 70: ACA AC Window Mode + "ADCA_CH0", // 71: ADCA Interrupt 0 + "UNUSED", // 72: not implemented on this device + "UNUSED", // 73: not implemented on this device + "UNUSED", // 74: not implemented on this device + "UNUSED", // 75: not implemented on this device + "UNUSED", // 76: not implemented on this device + "TCD0_OVF/TCD2_LUNF", // 77: TC D0 Overflow/TC D2 Low Byte Underflow + "TCD0_ERR/TCD2_HUNF", // 78: TC D0 Error/TC D2 High Byte Underflow + "TCD0_CCA/TCD2_LCMPA", // 79: TC D0 Compare or Capture A/TC D2 Low Byte Compare A + "TCD0_CCB/TCD2_LCMPB", // 80: TC D0 Compare or Capture B/TC D2 Low Byte Compare B + "TCD0_CCC/TCD2_LCMPC", // 81: TC D0 Compare or Capture C/TC D2 Low Byte Compare C + "TCD0_CCD/TCD2_LCMPD", // 82: TC D0 Compare or Capture D/TC D2 Low Byte Compare D + "UNUSED", // 83: not implemented on this device + "UNUSED", // 84: not implemented on this device + "UNUSED", // 85: not implemented on this device + "UNUSED", // 86: not implemented on this device + "SPID_INT", // 87: SPI D Interrupt + "USARTD0_RXC", // 88: USARTD 0 Reception Complete + "USARTD0_DRE", // 89: USARTD 0 Data Register Empty + "USARTD0_TXC", // 90: USARTD 0 Transmission Complete + "UNUSED", // 91: not implemented on this device + "UNUSED", // 92: not implemented on this device + "UNUSED", // 93: not implemented on this device + "UNUSED", // 94: not implemented on this device + "UNUSED", // 95: not implemented on this device + "UNUSED", // 96: not implemented on this device + "UNUSED", // 97: not implemented on this device + "UNUSED", // 98: not implemented on this device + "UNUSED", // 99: not implemented on this device + "UNUSED", // 100: not implemented on this device + "UNUSED", // 101: not implemented on this device + "UNUSED", // 102: not implemented on this device + "UNUSED", // 103: not implemented on this device + "PORTF_INT0", // 104: External Interrupt 0 PORT F + "PORTF_INT1", // 105: External Interrupt 1 PORT F + "UNUSED", // 106: not implemented on this device + "UNUSED", // 107: not implemented on this device + "TCF0_OVF/TCF2_LUNF", // 108: TC F0 Overflow/TC F2 Low Byte Underflow + "TCF0_ERR/TCF2_HUNF", // 109: TC F0 Error/TC F2 High Byte Underflow + "TCF0_CCA/TCF2_LCMPA", // 110: TC F0 Compare or Capture A/TC F2 Low Byte Compare A + "TCF0_CCB/TCF2_LCMPB", // 111: TC F0 Compare or Capture B/TC F2 Low Byte Compare B + "TCF0_CCC/TCF2_LCMPC", // 112: TC F0 Compare or Capture C/TC F2 Low Byte Compare C + "TCF0_CCD/TCF2_LCMPD", // 113: TC F0 Compare or Capture D/TC F2 Low Byte Compare D + "UNUSED", // 114: not implemented on this device + "UNUSED", // 115: not implemented on this device + "UNUSED", // 116: not implemented on this device + "UNUSED", // 117: not implemented on this device + "UNUSED", // 118: not implemented on this device + "UNUSED", // 119: not implemented on this device + "UNUSED", // 120: not implemented on this device + "UNUSED", // 121: not implemented on this device + "UNUSED", // 122: not implemented on this device + "UNUSED", // 123: not implemented on this device + "UNUSED", // 124: not implemented on this device + "USB_BUSEVENT", // 125: SOF, Suspend, Resume, Reset Bus Event Interrupts, CRC, Underflow, Overflow or Stall Error + "USB_TRNCOMPL", // 126: USB Transaction Complete +}; + +const char * const vtab_atxmega384d3[vts_atxmega384d3] = { // ATxmega384D3, ATxmega256D3, ATxmega192D3, ATxmega128D3, ATxmega64D3, ATxmega32D3 + "RESET", // 0: Reset (various reasons) + "OSC_OSCF", // 1: Oscillator Failure NMI + "PORTC_INT0", // 2: External Interrupt 0 PORT C + "PORTC_INT1", // 3: External Interrupt 1 PORT C + "PORTR_INT0", // 4: External Interrupt 0 PORT R + "PORTR_INT1", // 5: External Interrupt 1 PORT R + "UNUSED", // 6: not implemented on this device + "UNUSED", // 7: not implemented on this device + "UNUSED", // 8: not implemented on this device + "UNUSED", // 9: not implemented on this device + "RTC_OVF", // 10: RTC Overflow + "RTC_COMP", // 11: RTC Compare + "TWIC_TWIS", // 12: 2-Wire Interface C Periphery + "TWIC_TWIM", // 13: 2-Wire Interface C Controller + "TCC0_OVF/TCC2_LUNF", // 14: TC C0 Overflow/TC C2 Low Byte Underflow + "TCC0_ERR/TCC2_HUNF", // 15: TC C0 Error/TC C2 High Byte Underflow + "TCC0_CCA/TCC2_LCMPA", // 16: TC C0 Compare or Capture A/TC C2 Low Byte Compare A + "TCC0_CCB/TCC2_LCMPB", // 17: TC C0 Compare or Capture B/TC C2 Low Byte Compare B + "TCC0_CCC/TCC2_LCMPC", // 18: TC C0 Compare or Capture C/TC C2 Low Byte Compare C + "TCC0_CCD/TCC2_LCMPD", // 19: TC C0 Compare or Capture D/TC C2 Low Byte Compare D + "TCC1_OVF", // 20: TC C1 Overflow + "TCC1_ERR", // 21: TC C1 Error + "TCC1_CCA", // 22: TC C1 Compare or Capture A + "TCC1_CCB", // 23: TC C1 Compare or Capture B + "SPIC_INT", // 24: SPI C Interrupt + "USARTC0_RXC", // 25: USARTC 0 Reception Complete + "USARTC0_DRE", // 26: USARTC 0 Data Register Empty + "USARTC0_TXC", // 27: USARTC 0 Transmission Complete + "UNUSED", // 28: not implemented on this device + "UNUSED", // 29: not implemented on this device + "UNUSED", // 30: not implemented on this device + "UNUSED", // 31: not implemented on this device + "NVM_EE", // 32: NVM EEPROM + "NVM_SPM", // 33: NVM SPM + "PORTB_INT0", // 34: External Interrupt 0 PORT B + "PORTB_INT1", // 35: External Interrupt 1 PORT B + "UNUSED", // 36: not implemented on this device + "UNUSED", // 37: not implemented on this device + "UNUSED", // 38: not implemented on this device + "UNUSED", // 39: not implemented on this device + "UNUSED", // 40: not implemented on this device + "UNUSED", // 41: not implemented on this device + "UNUSED", // 42: not implemented on this device + "PORTE_INT0", // 43: External Interrupt 0 PORT E + "PORTE_INT1", // 44: External Interrupt 1 PORT E + "TWIE_TWIS", // 45: 2-Wire Interface E Periphery + "TWIE_TWIM", // 46: 2-Wire Interface E Controller + "TCE0_OVF/TCE2_LUNF", // 47: TC E0 Overflow/TC E2 Low Byte Underflow + "TCE0_ERR/TCE2_HUNF", // 48: TC E0 Error/TC E2 High Byte Underflow + "TCE0_CCA/TCE2_LCMPA", // 49: TC E0 Compare or Capture A/TC E2 Low Byte Compare A + "TCE0_CCB/TCE2_LCMPB", // 50: TC E0 Compare or Capture B/TC E2 Low Byte Compare B + "TCE0_CCC/TCE2_LCMPC", // 51: TC E0 Compare or Capture C/TC E2 Low Byte Compare C + "TCE0_CCD/TCE2_LCMPD", // 52: TC E0 Compare or Capture D/TC E2 Low Byte Compare D + "UNUSED", // 53: not implemented on this device + "UNUSED", // 54: not implemented on this device + "UNUSED", // 55: not implemented on this device + "UNUSED", // 56: not implemented on this device + "UNUSED", // 57: not implemented on this device + "USARTE0_RXC", // 58: USARTE 0 Reception Complete + "USARTE0_DRE", // 59: USARTE 0 Data Register Empty + "USARTE0_TXC", // 60: USARTE 0 Transmission Complete + "UNUSED", // 61: not implemented on this device + "UNUSED", // 62: not implemented on this device + "UNUSED", // 63: not implemented on this device + "PORTD_INT0", // 64: External Interrupt 0 PORT D + "PORTD_INT1", // 65: External Interrupt 1 PORT D + "PORTA_INT0", // 66: External Interrupt 0 PORT A + "PORTA_INT1", // 67: External Interrupt 1 PORT A + "ACA_AC0", // 68: ACA AC 0 Interrupt + "ACA_AC1", // 69: ACA AC 1 Interrupt + "ACA_ACW", // 70: ACA AC Window Mode + "ADCA_CH0", // 71: ADCA Interrupt 0 + "UNUSED", // 72: not implemented on this device + "UNUSED", // 73: not implemented on this device + "UNUSED", // 74: not implemented on this device + "UNUSED", // 75: not implemented on this device + "UNUSED", // 76: not implemented on this device + "TCD0_OVF/TCD2_LUNF", // 77: TC D0 Overflow/TC D2 Low Byte Underflow + "TCD0_ERR/TCD2_HUNF", // 78: TC D0 Error/TC D2 High Byte Underflow + "TCD0_CCA/TCD2_LCMPA", // 79: TC D0 Compare or Capture A/TC D2 Low Byte Compare A + "TCD0_CCB/TCD2_LCMPB", // 80: TC D0 Compare or Capture B/TC D2 Low Byte Compare B + "TCD0_CCC/TCD2_LCMPC", // 81: TC D0 Compare or Capture C/TC D2 Low Byte Compare C + "TCD0_CCD/TCD2_LCMPD", // 82: TC D0 Compare or Capture D/TC D2 Low Byte Compare D + "UNUSED", // 83: not implemented on this device + "UNUSED", // 84: not implemented on this device + "UNUSED", // 85: not implemented on this device + "UNUSED", // 86: not implemented on this device + "SPID_INT", // 87: SPI D Interrupt + "USARTD0_RXC", // 88: USARTD 0 Reception Complete + "USARTD0_DRE", // 89: USARTD 0 Data Register Empty + "USARTD0_TXC", // 90: USARTD 0 Transmission Complete + "UNUSED", // 91: not implemented on this device + "UNUSED", // 92: not implemented on this device + "UNUSED", // 93: not implemented on this device + "UNUSED", // 94: not implemented on this device + "UNUSED", // 95: not implemented on this device + "UNUSED", // 96: not implemented on this device + "UNUSED", // 97: not implemented on this device + "UNUSED", // 98: not implemented on this device + "UNUSED", // 99: not implemented on this device + "UNUSED", // 100: not implemented on this device + "UNUSED", // 101: not implemented on this device + "UNUSED", // 102: not implemented on this device + "UNUSED", // 103: not implemented on this device + "PORTF_INT0", // 104: External Interrupt 0 PORT F + "PORTF_INT1", // 105: External Interrupt 1 PORT F + "UNUSED", // 106: not implemented on this device + "UNUSED", // 107: not implemented on this device + "TCF0_OVF/TCF2_LUNF", // 108: TC F0 Overflow/TC F2 Low Byte Underflow + "TCF0_ERR/TCF2_HUNF", // 109: TC F0 Error/TC F2 High Byte Underflow + "TCF0_CCA/TCF2_LCMPA", // 110: TC F0 Compare or Capture A/TC F2 Low Byte Compare A + "TCF0_CCB/TCF2_LCMPB", // 111: TC F0 Compare or Capture B/TC F2 Low Byte Compare B + "TCF0_CCC/TCF2_LCMPC", // 112: TC F0 Compare or Capture C/TC F2 Low Byte Compare C + "TCF0_CCD/TCF2_LCMPD", // 113: TC F0 Compare or Capture D/TC F2 Low Byte Compare D +}; + +const char * const vtab_attiny402[vts_attiny402] = { // ATtiny402, ATtiny202 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "PORTA_PORT", // 3: Interrupt PORT A + "UNUSED", // 4: not implemented on this device + "UNUSED", // 5: not implemented on this device + "RTC_CNT", // 6: RTC Counter Interrupt + "RTC_PIT", // 7: RTC Periodic Interrupt Timer + "TCA0_LUNF/TCA0_OVF", // 8: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 9: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 10: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 11: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 12: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 13: TC B0 Interrupt + "UNUSED", // 14: not implemented on this device + "UNUSED", // 15: not implemented on this device + "AC0_AC", // 16: AC0 AC Interrupt + "ADC0_RESRDY", // 17: ADC 0 Result Ready + "ADC0_WCOMP", // 18: ADC 0 Window Comparator + "TWI0_TWIS", // 19: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 20: 2-Wire Interface 0 Controller + "SPI0_INT", // 21: SPI 0 Interrupt + "USART0_RXC", // 22: USART 0 Receive Complete + "USART0_DRE", // 23: USART 0 Data Register Empty + "USART0_TXC", // 24: USART 0 Transmit Complete + "NVMCTRL_EE", // 25: NVM EEPROM +}; + +const char * const vtab_attiny404[vts_attiny404] = { // ATtiny404, ATtiny204 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "PORTA_PORT", // 3: Interrupt PORT A + "PORTB_PORT", // 4: Interrupt PORT B + "UNUSED", // 5: not implemented on this device + "RTC_CNT", // 6: RTC Counter Interrupt + "RTC_PIT", // 7: RTC Periodic Interrupt Timer + "TCA0_LUNF/TCA0_OVF", // 8: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 9: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 10: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 11: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 12: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 13: TC B0 Interrupt + "UNUSED", // 14: not implemented on this device + "UNUSED", // 15: not implemented on this device + "AC0_AC", // 16: AC0 AC Interrupt + "ADC0_RESRDY", // 17: ADC 0 Result Ready + "ADC0_WCOMP", // 18: ADC 0 Window Comparator + "TWI0_TWIS", // 19: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 20: 2-Wire Interface 0 Controller + "SPI0_INT", // 21: SPI 0 Interrupt + "USART0_RXC", // 22: USART 0 Receive Complete + "USART0_DRE", // 23: USART 0 Data Register Empty + "USART0_TXC", // 24: USART 0 Transmit Complete + "NVMCTRL_EE", // 25: NVM EEPROM +}; + +const char * const vtab_attiny406[vts_attiny406] = { // ATtiny406 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "PORTA_PORT", // 3: Interrupt PORT A + "PORTB_PORT", // 4: Interrupt PORT B + "PORTC_PORT", // 5: Interrupt PORT C + "RTC_CNT", // 6: RTC Counter Interrupt + "RTC_PIT", // 7: RTC Periodic Interrupt Timer + "TCA0_LUNF/TCA0_OVF", // 8: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 9: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 10: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 11: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 12: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 13: TC B0 Interrupt + "UNUSED", // 14: not implemented on this device + "UNUSED", // 15: not implemented on this device + "AC0_AC", // 16: AC0 AC Interrupt + "ADC0_RESRDY", // 17: ADC 0 Result Ready + "ADC0_WCOMP", // 18: ADC 0 Window Comparator + "TWI0_TWIS", // 19: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 20: 2-Wire Interface 0 Controller + "SPI0_INT", // 21: SPI 0 Interrupt + "USART0_RXC", // 22: USART 0 Receive Complete + "USART0_DRE", // 23: USART 0 Data Register Empty + "USART0_TXC", // 24: USART 0 Transmit Complete + "NVMCTRL_EE", // 25: NVM EEPROM +}; + +const char * const vtab_attiny412[vts_attiny412] = { // ATtiny412, ATtiny212 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "PORTA_PORT", // 3: Interrupt PORT A + "UNUSED", // 4: not implemented on this device + "UNUSED", // 5: not implemented on this device + "RTC_CNT", // 6: RTC Counter Interrupt + "RTC_PIT", // 7: RTC Periodic Interrupt Timer + "TCA0_LUNF/TCA0_OVF", // 8: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 9: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 10: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 11: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 12: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 13: TC B0 Interrupt + "TCD0_OVF", // 14: TC D0 Overflow + "TCD0_TRIG", // 15: TC D0 Trigger + "AC0_AC", // 16: AC0 AC Interrupt + "ADC0_RESRDY", // 17: ADC 0 Result Ready + "ADC0_WCOMP", // 18: ADC 0 Window Comparator + "TWI0_TWIS", // 19: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 20: 2-Wire Interface 0 Controller + "SPI0_INT", // 21: SPI 0 Interrupt + "USART0_RXC", // 22: USART 0 Receive Complete + "USART0_DRE", // 23: USART 0 Data Register Empty + "USART0_TXC", // 24: USART 0 Transmit Complete + "NVMCTRL_EE", // 25: NVM EEPROM +}; + +const char * const vtab_attiny814[vts_attiny814] = { // ATtiny814, ATtiny414, ATtiny214 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "PORTA_PORT", // 3: Interrupt PORT A + "PORTB_PORT", // 4: Interrupt PORT B + "UNUSED", // 5: not implemented on this device + "RTC_CNT", // 6: RTC Counter Interrupt + "RTC_PIT", // 7: RTC Periodic Interrupt Timer + "TCA0_LUNF/TCA0_OVF", // 8: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 9: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 10: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 11: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 12: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 13: TC B0 Interrupt + "TCD0_OVF", // 14: TC D0 Overflow + "TCD0_TRIG", // 15: TC D0 Trigger + "AC0_AC", // 16: AC0 AC Interrupt + "ADC0_RESRDY", // 17: ADC 0 Result Ready + "ADC0_WCOMP", // 18: ADC 0 Window Comparator + "TWI0_TWIS", // 19: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 20: 2-Wire Interface 0 Controller + "SPI0_INT", // 21: SPI 0 Interrupt + "USART0_RXC", // 22: USART 0 Receive Complete + "USART0_DRE", // 23: USART 0 Data Register Empty + "USART0_TXC", // 24: USART 0 Transmit Complete + "NVMCTRL_EE", // 25: NVM EEPROM +}; + +const char * const vtab_attiny817[vts_attiny817] = { // ATtiny817, ATtiny816, ATtiny417, ATtiny416auto, ATtiny416 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "PORTA_PORT", // 3: Interrupt PORT A + "PORTB_PORT", // 4: Interrupt PORT B + "PORTC_PORT", // 5: Interrupt PORT C + "RTC_CNT", // 6: RTC Counter Interrupt + "RTC_PIT", // 7: RTC Periodic Interrupt Timer + "TCA0_LUNF/TCA0_OVF", // 8: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 9: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 10: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 11: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 12: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 13: TC B0 Interrupt + "TCD0_OVF", // 14: TC D0 Overflow + "TCD0_TRIG", // 15: TC D0 Trigger + "AC0_AC", // 16: AC0 AC Interrupt + "ADC0_RESRDY", // 17: ADC 0 Result Ready + "ADC0_WCOMP", // 18: ADC 0 Window Comparator + "TWI0_TWIS", // 19: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 20: 2-Wire Interface 0 Controller + "SPI0_INT", // 21: SPI 0 Interrupt + "USART0_RXC", // 22: USART 0 Receive Complete + "USART0_DRE", // 23: USART 0 Data Register Empty + "USART0_TXC", // 24: USART 0 Transmit Complete + "NVMCTRL_EE", // 25: NVM EEPROM +}; + +const char * const vtab_attiny1607[vts_attiny1607] = { // ATtiny1607, ATtiny1606, ATtiny1604, ATtiny807, ATtiny806, ATtiny804 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "PORTA_PORT", // 3: Interrupt PORT A + "PORTB_PORT", // 4: Interrupt PORT B + "PORTC_PORT", // 5: Interrupt PORT C + "RTC_CNT", // 6: RTC Counter Interrupt + "RTC_PIT", // 7: RTC Periodic Interrupt Timer + "TCA0_LUNF/TCA0_OVF", // 8: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 9: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 10: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 11: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 12: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 13: TC B0 Interrupt + "UNUSED", // 14: not implemented on this device + "UNUSED", // 15: not implemented on this device + "UNUSED", // 16: not implemented on this device + "AC0_AC", // 17: AC0 AC Interrupt + "UNUSED", // 18: not implemented on this device + "UNUSED", // 19: not implemented on this device + "ADC0_RESRDY", // 20: ADC 0 Result Ready + "ADC0_WCOMP", // 21: ADC 0 Window Comparator + "UNUSED", // 22: not implemented on this device + "UNUSED", // 23: not implemented on this device + "TWI0_TWIS", // 24: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 25: 2-Wire Interface 0 Controller + "SPI0_INT", // 26: SPI 0 Interrupt + "USART0_RXC", // 27: USART 0 Receive Complete + "USART0_DRE", // 28: USART 0 Data Register Empty + "USART0_TXC", // 29: USART 0 Transmit Complete + "NVMCTRL_EE", // 30: NVM EEPROM +}; + +const char * const vtab_attiny1614[vts_attiny1614] = { // ATtiny1614 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "PORTA_PORT", // 3: Interrupt PORT A + "PORTB_PORT", // 4: Interrupt PORT B + "UNUSED", // 5: not implemented on this device + "RTC_CNT", // 6: RTC Counter Interrupt + "RTC_PIT", // 7: RTC Periodic Interrupt Timer + "TCA0_LUNF/TCA0_OVF", // 8: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 9: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 10: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 11: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 12: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 13: TC B0 Interrupt + "TCB1_INT", // 14: TC B1 Interrupt + "TCD0_OVF", // 15: TC D0 Overflow + "TCD0_TRIG", // 16: TC D0 Trigger + "AC0_AC", // 17: AC0 AC Interrupt + "AC1_AC", // 18: AC1 AC Interrupt + "AC2_AC", // 19: AC2 AC Interrupt + "ADC0_RESRDY", // 20: ADC 0 Result Ready + "ADC0_WCOMP", // 21: ADC 0 Window Comparator + "ADC1_RESRDY", // 22: ADC 1 Result Ready + "ADC1_WCOMP", // 23: ADC 1 Window Comparator + "TWI0_TWIS", // 24: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 25: 2-Wire Interface 0 Controller + "SPI0_INT", // 26: SPI 0 Interrupt + "USART0_RXC", // 27: USART 0 Receive Complete + "USART0_DRE", // 28: USART 0 Data Register Empty + "USART0_TXC", // 29: USART 0 Transmit Complete + "NVMCTRL_EE", // 30: NVM EEPROM +}; + +const char * const vtab_attiny3214[vts_attiny3214] = { // ATtiny3214 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "PORTA_PORT", // 3: Interrupt PORT A + "PORTB_PORT", // 4: Interrupt PORT B + "PORTC_PORT", // 5: Interrupt PORT C + "RTC_CNT", // 6: RTC Counter Interrupt + "RTC_PIT", // 7: RTC Periodic Interrupt Timer + "TCA0_LUNF", // 8: TC A0 Low Underflow + "TCA0_HUNF", // 9: TC A0 High Underflow + "TCA0_CMP0", // 10: TC A0 Compare 0 + "TCA0_CMP1", // 11: TC A0 Compare 1 + "TCA0_CMP2", // 12: TC A0 Compare 2 + "TCB0_INT", // 13: TC B0 Interrupt + "TCB1_INT", // 14: TC B1 Interrupt + "TCD0_OVF", // 15: TC D0 Overflow + "TCD0_TRIG", // 16: TC D0 Trigger + "AC0_AC", // 17: AC0 AC Interrupt + "AC1_AC", // 18: AC1 AC Interrupt + "AC2_AC", // 19: AC2 AC Interrupt + "ADC0_RESRDY", // 20: ADC 0 Result Ready + "ADC0_WCOMP", // 21: ADC 0 Window Comparator + "ADC1_RESRDY", // 22: ADC 1 Result Ready + "ADC1_WCOMP", // 23: ADC 1 Window Comparator + "TWI0_TWIS", // 24: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 25: 2-Wire Interface 0 Controller + "SPI0_INT", // 26: SPI 0 Interrupt + "USART0_RXC", // 27: USART 0 Receive Complete + "USART0_DRE", // 28: USART 0 Data Register Empty + "USART0_TXC", // 29: USART 0 Transmit Complete + "NVMCTRL_EE", // 30: NVM EEPROM +}; + +const char * const vtab_attiny3217[vts_attiny3217] = { // ATtiny3217, ATtiny3216, ATtiny1617, ATtiny1616 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "PORTA_PORT", // 3: Interrupt PORT A + "PORTB_PORT", // 4: Interrupt PORT B + "PORTC_PORT", // 5: Interrupt PORT C + "RTC_CNT", // 6: RTC Counter Interrupt + "RTC_PIT", // 7: RTC Periodic Interrupt Timer + "TCA0_LUNF/TCA0_OVF", // 8: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 9: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 10: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 11: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 12: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 13: TC B0 Interrupt + "TCB1_INT", // 14: TC B1 Interrupt + "TCD0_OVF", // 15: TC D0 Overflow + "TCD0_TRIG", // 16: TC D0 Trigger + "AC0_AC", // 17: AC0 AC Interrupt + "AC1_AC", // 18: AC1 AC Interrupt + "AC2_AC", // 19: AC2 AC Interrupt + "ADC0_RESRDY", // 20: ADC 0 Result Ready + "ADC0_WCOMP", // 21: ADC 0 Window Comparator + "ADC1_RESRDY", // 22: ADC 1 Result Ready + "ADC1_WCOMP", // 23: ADC 1 Window Comparator + "TWI0_TWIS", // 24: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 25: 2-Wire Interface 0 Controller + "SPI0_INT", // 26: SPI 0 Interrupt + "USART0_RXC", // 27: USART 0 Receive Complete + "USART0_DRE", // 28: USART 0 Data Register Empty + "USART0_TXC", // 29: USART 0 Transmit Complete + "NVMCTRL_EE", // 30: NVM EEPROM +}; + +const char * const vtab_attiny3227[vts_attiny3227] = { // ATtiny3227, ATtiny3226, ATtiny3224, ATtiny1627, ATtiny1626, ATtiny1624, ATtiny827, ATtiny826, ATtiny824, ATtiny427, ATtiny426, ATtiny424 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "RTC_CNT", // 3: RTC Counter Interrupt + "RTC_PIT", // 4: RTC Periodic Interrupt Timer + "CCL_CCL", // 5: Configurable Custom Logic + "PORTA_PORT", // 6: Interrupt PORT A + "PORTB_PORT", // 7: Interrupt PORT B + "TCA0_LUNF/TCA0_OVF", // 8: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 9: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 10: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 11: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 12: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 13: TC B0 Interrupt + "TWI0_TWIS", // 14: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 15: 2-Wire Interface 0 Controller + "SPI0_INT", // 16: SPI 0 Interrupt + "USART0_RXC", // 17: USART 0 Receive Complete + "USART0_DRE", // 18: USART 0 Data Register Empty + "USART0_TXC", // 19: USART 0 Transmit Complete + "AC0_AC", // 20: AC0 AC Interrupt + "ADC0_ERROR", // 21: ADC 0 Error + "ADC0_RESRDY", // 22: ADC 0 Result Ready + "ADC0_SAMPRDY", // 23: ADC 0 Sample Ready + "PORTC_PORT", // 24: Interrupt PORT C + "TCB1_INT", // 25: TC B1 Interrupt + "USART1_RXC", // 26: USART 1 Receive Complete + "USART1_DRE", // 27: USART 1 Data Register Empty + "USART1_TXC", // 28: USART 1 Transmit Complete + "NVMCTRL_EE", // 29: NVM EEPROM +}; + +const char * const vtab_atmega4808[vts_atmega4808] = { // ATmega4808, ATmega3208, ATmega1608, ATmega808 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "RTC_CNT", // 3: RTC Counter Interrupt + "RTC_PIT", // 4: RTC Periodic Interrupt Timer + "CCL_CCL", // 5: Configurable Custom Logic + "PORTA_PORT", // 6: Interrupt PORT A + "TCA0_LUNF/TCA0_OVF", // 7: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 8: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 9: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 10: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 11: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 12: TC B0 Interrupt + "TCB1_INT", // 13: TC B1 Interrupt + "TWI0_TWIS", // 14: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 15: 2-Wire Interface 0 Controller + "SPI0_INT", // 16: SPI 0 Interrupt + "USART0_RXC", // 17: USART 0 Receive Complete + "USART0_DRE", // 18: USART 0 Data Register Empty + "USART0_TXC", // 19: USART 0 Transmit Complete + "PORTD_PORT", // 20: Interrupt PORT D + "AC0_AC", // 21: AC0 AC Interrupt + "ADC0_RESRDY", // 22: ADC 0 Result Ready + "ADC0_WCOMP", // 23: ADC 0 Window Comparator + "PORTC_PORT", // 24: Interrupt PORT C + "TCB2_INT", // 25: TC B2 Interrupt + "USART1_RXC", // 26: USART 1 Receive Complete + "USART1_DRE", // 27: USART 1 Data Register Empty + "USART1_TXC", // 28: USART 1 Transmit Complete + "PORTF_PORT", // 29: Interrupt PORT F + "NVMCTRL_EE", // 30: NVM EEPROM + "USART2_RXC", // 31: USART 2 Receive Complete + "USART2_DRE", // 32: USART 2 Data Register Empty + "USART2_TXC", // 33: USART 2 Transmit Complete + "PORTB_PORT", // 34: Interrupt PORT B + "PORTE_PORT", // 35: Interrupt PORT E +}; + +const char * const vtab_atmega4809[vts_atmega4809] = { // ATmega4809, ATmega3209, ATmega1609, ATmega809 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "RTC_CNT", // 3: RTC Counter Interrupt + "RTC_PIT", // 4: RTC Periodic Interrupt Timer + "CCL_CCL", // 5: Configurable Custom Logic + "PORTA_PORT", // 6: Interrupt PORT A + "TCA0_LUNF/TCA0_OVF", // 7: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 8: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 9: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 10: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 11: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 12: TC B0 Interrupt + "TCB1_INT", // 13: TC B1 Interrupt + "TWI0_TWIS", // 14: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 15: 2-Wire Interface 0 Controller + "SPI0_INT", // 16: SPI 0 Interrupt + "USART0_RXC", // 17: USART 0 Receive Complete + "USART0_DRE", // 18: USART 0 Data Register Empty + "USART0_TXC", // 19: USART 0 Transmit Complete + "PORTD_PORT", // 20: Interrupt PORT D + "AC0_AC", // 21: AC0 AC Interrupt + "ADC0_RESRDY", // 22: ADC 0 Result Ready + "ADC0_WCOMP", // 23: ADC 0 Window Comparator + "PORTC_PORT", // 24: Interrupt PORT C + "TCB2_INT", // 25: TC B2 Interrupt + "USART1_RXC", // 26: USART 1 Receive Complete + "USART1_DRE", // 27: USART 1 Data Register Empty + "USART1_TXC", // 28: USART 1 Transmit Complete + "PORTF_PORT", // 29: Interrupt PORT F + "NVMCTRL_EE", // 30: NVM EEPROM + "USART2_RXC", // 31: USART 2 Receive Complete + "USART2_DRE", // 32: USART 2 Data Register Empty + "USART2_TXC", // 33: USART 2 Transmit Complete + "PORTB_PORT", // 34: Interrupt PORT B + "PORTE_PORT", // 35: Interrupt PORT E + "TCB3_INT", // 36: TC B3 Interrupt + "USART3_RXC", // 37: USART 3 Receive Complete + "USART3_DRE", // 38: USART 3 Data Register Empty + "USART3_TXC", // 39: USART 3 Transmit Complete +}; + +const char * const vtab_avr64dd32[vts_avr64dd32] = { // AVR64DD32, AVR64DD28, AVR64DD20, AVR64DD14, AVR32DD32, AVR32DD28, AVR32DD20, AVR32DD14, AVR16DD32, AVR16DD28, AVR16DD20, AVR16DD14 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "CLKCTRL_CFD", // 3: Clock Failure Detection + "MVIO_MVIO", // 4: Multi-Voltage I/O + "RTC_CNT", // 5: RTC Counter Interrupt + "RTC_PIT", // 6: RTC Periodic Interrupt Timer + "CCL_CCL", // 7: Configurable Custom Logic + "PORTA_PORT", // 8: Interrupt PORT A + "TCA0_LUNF/TCA0_OVF", // 9: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 10: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 11: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 12: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 13: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 14: TC B0 Interrupt + "TCB1_INT", // 15: TC B1 Interrupt + "TCD0_OVF", // 16: TC D0 Overflow + "TCD0_TRIG", // 17: TC D0 Trigger + "TWI0_TWIS", // 18: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 19: 2-Wire Interface 0 Controller + "SPI0_INT", // 20: SPI 0 Interrupt + "USART0_RXC", // 21: USART 0 Receive Complete + "USART0_DRE", // 22: USART 0 Data Register Empty + "USART0_TXC", // 23: USART 0 Transmit Complete + "PORTD_PORT", // 24: Interrupt PORT D + "AC0_AC", // 25: AC0 AC Interrupt + "ADC0_RESRDY", // 26: ADC 0 Result Ready + "ADC0_WCMP", // 27: ADC 0 Window Comparator + "ZCD3_ZCD", // 28: Zero Cross Detect 3 + "PORTC_PORT", // 29: Interrupt PORT C + "TCB2_INT", // 30: TC B2 Interrupt + "USART1_RXC", // 31: USART 1 Receive Complete + "USART1_DRE", // 32: USART 1 Data Register Empty + "USART1_TXC", // 33: USART 1 Transmit Complete + "PORTF_PORT", // 34: Interrupt PORT F + "NVMCTRL_EE", // 35: NVM EEPROM +}; + +const char * const vtab_avr64ea32[vts_avr64ea32] = { // AVR64EA32, AVR64EA28 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "CLKCTRL_CFD", // 3: Clock Failure Detection + "RTC_CNT", // 4: RTC Counter Interrupt + "RTC_PIT", // 5: RTC Periodic Interrupt Timer + "CCL_CCL", // 6: Configurable Custom Logic + "PORTA_PORT", // 7: Interrupt PORT A + "TCA0_LUNF/TCA0_OVF", // 8: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 9: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 10: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 11: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 12: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 13: TC B0 Interrupt + "TCB1_INT", // 14: TC B1 Interrupt + "TWI0_TWIS", // 15: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 16: 2-Wire Interface 0 Controller + "SPI0_INT", // 17: SPI 0 Interrupt + "USART0_RXC", // 18: USART 0 Receive Complete + "USART0_DRE", // 19: USART 0 Data Register Empty + "USART0_TXC", // 20: USART 0 Transmit Complete + "PORTD_PORT", // 21: Interrupt PORT D + "AC0_AC", // 22: AC0 AC Interrupt + "ADC0_ERROR", // 23: ADC 0 Error + "ADC0_RESRDY", // 24: ADC 0 Result Ready + "ADC0_SAMPRDY", // 25: ADC 0 Sample Ready + "AC1_AC", // 26: AC1 AC Interrupt + "PORTC_PORT", // 27: Interrupt PORT C + "TCB2_INT", // 28: TC B2 Interrupt + "USART1_RXC", // 29: USART 1 Receive Complete + "USART1_DRE", // 30: USART 1 Data Register Empty + "USART1_TXC", // 31: USART 1 Transmit Complete + "PORTF_PORT", // 32: Interrupt PORT F + "NVMCTRL_EEREADY/NVMCTRL_FLREADY/NVMCTRL_NVMREADY", // 33: NVM EEPROM Ready/NVM Flash Ready/NVM Ready + "USART2_RXC", // 34: USART 2 Receive Complete + "USART2_DRE", // 35: USART 2 Data Register Empty + "USART2_TXC", // 36: USART 2 Transmit Complete +}; + +const char * const vtab_avr64ea48[vts_avr64ea48] = { // AVR64EA48 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "CLKCTRL_CFD", // 3: Clock Failure Detection + "RTC_CNT", // 4: RTC Counter Interrupt + "RTC_PIT", // 5: RTC Periodic Interrupt Timer + "CCL_CCL", // 6: Configurable Custom Logic + "PORTA_PORT", // 7: Interrupt PORT A + "TCA0_LUNF/TCA0_OVF", // 8: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 9: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 10: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 11: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 12: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 13: TC B0 Interrupt + "TCB1_INT", // 14: TC B1 Interrupt + "TWI0_TWIS", // 15: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 16: 2-Wire Interface 0 Controller + "SPI0_INT", // 17: SPI 0 Interrupt + "USART0_RXC", // 18: USART 0 Receive Complete + "USART0_DRE", // 19: USART 0 Data Register Empty + "USART0_TXC", // 20: USART 0 Transmit Complete + "PORTD_PORT", // 21: Interrupt PORT D + "AC0_AC", // 22: AC0 AC Interrupt + "ADC0_ERROR", // 23: ADC 0 Error + "ADC0_RESRDY", // 24: ADC 0 Result Ready + "ADC0_SAMPRDY", // 25: ADC 0 Sample Ready + "AC1_AC", // 26: AC1 AC Interrupt + "PORTC_PORT", // 27: Interrupt PORT C + "TCB2_INT", // 28: TC B2 Interrupt + "USART1_RXC", // 29: USART 1 Receive Complete + "USART1_DRE", // 30: USART 1 Data Register Empty + "USART1_TXC", // 31: USART 1 Transmit Complete + "PORTF_PORT", // 32: Interrupt PORT F + "NVMCTRL_EEREADY/NVMCTRL_FLREADY/NVMCTRL_NVMREADY", // 33: NVM EEPROM Ready/NVM Flash Ready/NVM Ready + "USART2_RXC", // 34: USART 2 Receive Complete + "USART2_DRE", // 35: USART 2 Data Register Empty + "USART2_TXC", // 36: USART 2 Transmit Complete + "TCB3_INT", // 37: TC B3 Interrupt + "TCA1_LUNF/TCA1_OVF", // 38: TC A1 Low Underflow/TC A1 Overflow + "TCA1_HUNF", // 39: TC A1 High Underflow + "TCA1_CMP0/TCA1_LCMP0", // 40: TC A1 Compare 0/TC A1 Low Compare 0 + "TCA1_CMP1/TCA1_LCMP1", // 41: TC A1 Compare 1/TC A1 Low Compare 1 + "TCA1_CMP2/TCA1_LCMP2", // 42: TC A1 Compare 2/TC A1 Low Compare 2 + "PORTE_PORT", // 43: Interrupt PORT E + "PORTB_PORT", // 44: Interrupt PORT B +}; + +const char * const vtab_avr128da28[vts_avr128da28] = { // AVR128DA28, AVR64DA28, AVR32DA28 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "RTC_CNT", // 3: RTC Counter Interrupt + "RTC_PIT", // 4: RTC Periodic Interrupt Timer + "CCL_CCL", // 5: Configurable Custom Logic + "PORTA_PORT", // 6: Interrupt PORT A + "TCA0_LUNF/TCA0_OVF", // 7: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 8: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 9: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 10: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 11: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 12: TC B0 Interrupt + "TCB1_INT", // 13: TC B1 Interrupt + "TCD0_OVF", // 14: TC D0 Overflow + "TCD0_TRIG", // 15: TC D0 Trigger + "TWI0_TWIS", // 16: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 17: 2-Wire Interface 0 Controller + "SPI0_INT", // 18: SPI 0 Interrupt + "USART0_RXC", // 19: USART 0 Receive Complete + "USART0_DRE", // 20: USART 0 Data Register Empty + "USART0_TXC", // 21: USART 0 Transmit Complete + "PORTD_PORT", // 22: Interrupt PORT D + "AC0_AC", // 23: AC0 AC Interrupt + "ADC0_RESRDY", // 24: ADC 0 Result Ready + "ADC0_WCMP", // 25: ADC 0 Window Comparator + "ZCD0_ZCD", // 26: Zero Cross Detect 0 + "PTC_PTC", // 27: PTC Interrupt + "AC1_AC", // 28: AC1 AC Interrupt + "PORTC_PORT", // 29: Interrupt PORT C + "TCB2_INT", // 30: TC B2 Interrupt + "USART1_RXC", // 31: USART 1 Receive Complete + "USART1_DRE", // 32: USART 1 Data Register Empty + "USART1_TXC", // 33: USART 1 Transmit Complete + "PORTF_PORT", // 34: Interrupt PORT F + "NVMCTRL_EE", // 35: NVM EEPROM + "SPI1_INT", // 36: SPI 1 Interrupt + "USART2_RXC", // 37: USART 2 Receive Complete + "USART2_DRE", // 38: USART 2 Data Register Empty + "USART2_TXC", // 39: USART 2 Transmit Complete + "AC2_AC", // 40: AC2 AC Interrupt +}; + +const char * const vtab_avr128db28[vts_avr128db28] = { // AVR128DB28, AVR64DB28, AVR32DB28 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "CLKCTRL_CFD", // 3: Clock Failure Detection + "MVIO_MVIO", // 4: Multi-Voltage I/O + "RTC_CNT", // 5: RTC Counter Interrupt + "RTC_PIT", // 6: RTC Periodic Interrupt Timer + "CCL_CCL", // 7: Configurable Custom Logic + "PORTA_PORT", // 8: Interrupt PORT A + "TCA0_LUNF/TCA0_OVF", // 9: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 10: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 11: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 12: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 13: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 14: TC B0 Interrupt + "TCB1_INT", // 15: TC B1 Interrupt + "TCD0_OVF", // 16: TC D0 Overflow + "TCD0_TRIG", // 17: TC D0 Trigger + "TWI0_TWIS", // 18: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 19: 2-Wire Interface 0 Controller + "SPI0_INT", // 20: SPI 0 Interrupt + "USART0_RXC", // 21: USART 0 Receive Complete + "USART0_DRE", // 22: USART 0 Data Register Empty + "USART0_TXC", // 23: USART 0 Transmit Complete + "PORTD_PORT", // 24: Interrupt PORT D + "AC0_AC", // 25: AC0 AC Interrupt + "ADC0_RESRDY", // 26: ADC 0 Result Ready + "ADC0_WCMP", // 27: ADC 0 Window Comparator + "ZCD0_ZCD", // 28: Zero Cross Detect 0 + "AC1_AC", // 29: AC1 AC Interrupt + "PORTC_PORT", // 30: Interrupt PORT C + "TCB2_INT", // 31: TC B2 Interrupt + "USART1_RXC", // 32: USART 1 Receive Complete + "USART1_DRE", // 33: USART 1 Data Register Empty + "USART1_TXC", // 34: USART 1 Transmit Complete + "PORTF_PORT", // 35: Interrupt PORT F + "NVMCTRL_EE", // 36: NVM EEPROM + "SPI1_INT", // 37: SPI 1 Interrupt + "USART2_RXC", // 38: USART 2 Receive Complete + "USART2_DRE", // 39: USART 2 Data Register Empty + "USART2_TXC", // 40: USART 2 Transmit Complete + "AC2_AC", // 41: AC2 AC Interrupt +}; + +const char * const vtab_avr128da32[vts_avr128da32] = { // AVR128DA32, AVR64DA32, AVR32DA32 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "RTC_CNT", // 3: RTC Counter Interrupt + "RTC_PIT", // 4: RTC Periodic Interrupt Timer + "CCL_CCL", // 5: Configurable Custom Logic + "PORTA_PORT", // 6: Interrupt PORT A + "TCA0_LUNF/TCA0_OVF", // 7: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 8: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 9: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 10: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 11: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 12: TC B0 Interrupt + "TCB1_INT", // 13: TC B1 Interrupt + "TCD0_OVF", // 14: TC D0 Overflow + "TCD0_TRIG", // 15: TC D0 Trigger + "TWI0_TWIS", // 16: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 17: 2-Wire Interface 0 Controller + "SPI0_INT", // 18: SPI 0 Interrupt + "USART0_RXC", // 19: USART 0 Receive Complete + "USART0_DRE", // 20: USART 0 Data Register Empty + "USART0_TXC", // 21: USART 0 Transmit Complete + "PORTD_PORT", // 22: Interrupt PORT D + "AC0_AC", // 23: AC0 AC Interrupt + "ADC0_RESRDY", // 24: ADC 0 Result Ready + "ADC0_WCMP", // 25: ADC 0 Window Comparator + "ZCD0_ZCD", // 26: Zero Cross Detect 0 + "PTC_PTC", // 27: PTC Interrupt + "AC1_AC", // 28: AC1 AC Interrupt + "PORTC_PORT", // 29: Interrupt PORT C + "TCB2_INT", // 30: TC B2 Interrupt + "USART1_RXC", // 31: USART 1 Receive Complete + "USART1_DRE", // 32: USART 1 Data Register Empty + "USART1_TXC", // 33: USART 1 Transmit Complete + "PORTF_PORT", // 34: Interrupt PORT F + "NVMCTRL_EE", // 35: NVM EEPROM + "SPI1_INT", // 36: SPI 1 Interrupt + "USART2_RXC", // 37: USART 2 Receive Complete + "USART2_DRE", // 38: USART 2 Data Register Empty + "USART2_TXC", // 39: USART 2 Transmit Complete + "AC2_AC", // 40: AC2 AC Interrupt + "UNUSED", // 41: not implemented on this device + "TWI1_TWIS", // 42: 2-Wire Interface 1 Periphery + "TWI1_TWIM", // 43: 2-Wire Interface 1 Controller +}; + +const char * const vtab_avr128db32[vts_avr128db32] = { // AVR128DB32, AVR64DB32, AVR32DB32 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "CLKCTRL_CFD", // 3: Clock Failure Detection + "MVIO_MVIO", // 4: Multi-Voltage I/O + "RTC_CNT", // 5: RTC Counter Interrupt + "RTC_PIT", // 6: RTC Periodic Interrupt Timer + "CCL_CCL", // 7: Configurable Custom Logic + "PORTA_PORT", // 8: Interrupt PORT A + "TCA0_LUNF/TCA0_OVF", // 9: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 10: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 11: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 12: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 13: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 14: TC B0 Interrupt + "TCB1_INT", // 15: TC B1 Interrupt + "TCD0_OVF", // 16: TC D0 Overflow + "TCD0_TRIG", // 17: TC D0 Trigger + "TWI0_TWIS", // 18: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 19: 2-Wire Interface 0 Controller + "SPI0_INT", // 20: SPI 0 Interrupt + "USART0_RXC", // 21: USART 0 Receive Complete + "USART0_DRE", // 22: USART 0 Data Register Empty + "USART0_TXC", // 23: USART 0 Transmit Complete + "PORTD_PORT", // 24: Interrupt PORT D + "AC0_AC", // 25: AC0 AC Interrupt + "ADC0_RESRDY", // 26: ADC 0 Result Ready + "ADC0_WCMP", // 27: ADC 0 Window Comparator + "ZCD0_ZCD", // 28: Zero Cross Detect 0 + "AC1_AC", // 29: AC1 AC Interrupt + "PORTC_PORT", // 30: Interrupt PORT C + "TCB2_INT", // 31: TC B2 Interrupt + "USART1_RXC", // 32: USART 1 Receive Complete + "USART1_DRE", // 33: USART 1 Data Register Empty + "USART1_TXC", // 34: USART 1 Transmit Complete + "PORTF_PORT", // 35: Interrupt PORT F + "NVMCTRL_EE", // 36: NVM EEPROM + "SPI1_INT", // 37: SPI 1 Interrupt + "USART2_RXC", // 38: USART 2 Receive Complete + "USART2_DRE", // 39: USART 2 Data Register Empty + "USART2_TXC", // 40: USART 2 Transmit Complete + "AC2_AC", // 41: AC2 AC Interrupt + "TWI1_TWIS", // 42: 2-Wire Interface 1 Periphery + "TWI1_TWIM", // 43: 2-Wire Interface 1 Controller +}; + +const char * const vtab_avr128da48[vts_avr128da48] = { // AVR128DA48, AVR64DA48, AVR32DA48 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "RTC_CNT", // 3: RTC Counter Interrupt + "RTC_PIT", // 4: RTC Periodic Interrupt Timer + "CCL_CCL", // 5: Configurable Custom Logic + "PORTA_PORT", // 6: Interrupt PORT A + "TCA0_LUNF/TCA0_OVF", // 7: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 8: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 9: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 10: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 11: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 12: TC B0 Interrupt + "TCB1_INT", // 13: TC B1 Interrupt + "TCD0_OVF", // 14: TC D0 Overflow + "TCD0_TRIG", // 15: TC D0 Trigger + "TWI0_TWIS", // 16: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 17: 2-Wire Interface 0 Controller + "SPI0_INT", // 18: SPI 0 Interrupt + "USART0_RXC", // 19: USART 0 Receive Complete + "USART0_DRE", // 20: USART 0 Data Register Empty + "USART0_TXC", // 21: USART 0 Transmit Complete + "PORTD_PORT", // 22: Interrupt PORT D + "AC0_AC", // 23: AC0 AC Interrupt + "ADC0_RESRDY", // 24: ADC 0 Result Ready + "ADC0_WCMP", // 25: ADC 0 Window Comparator + "ZCD0_ZCD", // 26: Zero Cross Detect 0 + "PTC_PTC", // 27: PTC Interrupt + "AC1_AC", // 28: AC1 AC Interrupt + "PORTC_PORT", // 29: Interrupt PORT C + "TCB2_INT", // 30: TC B2 Interrupt + "USART1_RXC", // 31: USART 1 Receive Complete + "USART1_DRE", // 32: USART 1 Data Register Empty + "USART1_TXC", // 33: USART 1 Transmit Complete + "PORTF_PORT", // 34: Interrupt PORT F + "NVMCTRL_EE", // 35: NVM EEPROM + "SPI1_INT", // 36: SPI 1 Interrupt + "USART2_RXC", // 37: USART 2 Receive Complete + "USART2_DRE", // 38: USART 2 Data Register Empty + "USART2_TXC", // 39: USART 2 Transmit Complete + "AC2_AC", // 40: AC2 AC Interrupt + "TCB3_INT", // 41: TC B3 Interrupt + "TWI1_TWIS", // 42: 2-Wire Interface 1 Periphery + "TWI1_TWIM", // 43: 2-Wire Interface 1 Controller + "PORTB_PORT", // 44: Interrupt PORT B + "PORTE_PORT", // 45: Interrupt PORT E + "TCA1_LUNF/TCA1_OVF", // 46: TC A1 Low Underflow/TC A1 Overflow + "TCA1_HUNF", // 47: TC A1 High Underflow + "TCA1_CMP0/TCA1_LCMP0", // 48: TC A1 Compare 0/TC A1 Low Compare 0 + "TCA1_CMP1/TCA1_LCMP1", // 49: TC A1 Compare 1/TC A1 Low Compare 1 + "TCA1_CMP2/TCA1_LCMP2", // 50: TC A1 Compare 2/TC A1 Low Compare 2 + "ZCD1_ZCD", // 51: Zero Cross Detect 1 + "USART3_RXC", // 52: USART 3 Receive Complete + "USART3_DRE", // 53: USART 3 Data Register Empty + "USART3_TXC", // 54: USART 3 Transmit Complete + "USART4_RXC", // 55: USART 4 Receive Complete + "USART4_DRE", // 56: USART 4 Data Register Empty + "USART4_TXC", // 57: USART 4 Transmit Complete +}; + +const char * const vtab_avr128db48[vts_avr128db48] = { // AVR128DB48, AVR64DB48, AVR32DB48 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "CLKCTRL_CFD", // 3: Clock Failure Detection + "MVIO_MVIO", // 4: Multi-Voltage I/O + "RTC_CNT", // 5: RTC Counter Interrupt + "RTC_PIT", // 6: RTC Periodic Interrupt Timer + "CCL_CCL", // 7: Configurable Custom Logic + "PORTA_PORT", // 8: Interrupt PORT A + "TCA0_LUNF/TCA0_OVF", // 9: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 10: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 11: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 12: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 13: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 14: TC B0 Interrupt + "TCB1_INT", // 15: TC B1 Interrupt + "TCD0_OVF", // 16: TC D0 Overflow + "TCD0_TRIG", // 17: TC D0 Trigger + "TWI0_TWIS", // 18: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 19: 2-Wire Interface 0 Controller + "SPI0_INT", // 20: SPI 0 Interrupt + "USART0_RXC", // 21: USART 0 Receive Complete + "USART0_DRE", // 22: USART 0 Data Register Empty + "USART0_TXC", // 23: USART 0 Transmit Complete + "PORTD_PORT", // 24: Interrupt PORT D + "AC0_AC", // 25: AC0 AC Interrupt + "ADC0_RESRDY", // 26: ADC 0 Result Ready + "ADC0_WCMP", // 27: ADC 0 Window Comparator + "ZCD0_ZCD", // 28: Zero Cross Detect 0 + "AC1_AC", // 29: AC1 AC Interrupt + "PORTC_PORT", // 30: Interrupt PORT C + "TCB2_INT", // 31: TC B2 Interrupt + "USART1_RXC", // 32: USART 1 Receive Complete + "USART1_DRE", // 33: USART 1 Data Register Empty + "USART1_TXC", // 34: USART 1 Transmit Complete + "PORTF_PORT", // 35: Interrupt PORT F + "NVMCTRL_EE", // 36: NVM EEPROM + "SPI1_INT", // 37: SPI 1 Interrupt + "USART2_RXC", // 38: USART 2 Receive Complete + "USART2_DRE", // 39: USART 2 Data Register Empty + "USART2_TXC", // 40: USART 2 Transmit Complete + "AC2_AC", // 41: AC2 AC Interrupt + "TWI1_TWIS", // 42: 2-Wire Interface 1 Periphery + "TWI1_TWIM", // 43: 2-Wire Interface 1 Controller + "TCB3_INT", // 44: TC B3 Interrupt + "PORTB_PORT", // 45: Interrupt PORT B + "PORTE_PORT", // 46: Interrupt PORT E + "TCA1_LUNF/TCA1_OVF", // 47: TC A1 Low Underflow/TC A1 Overflow + "TCA1_HUNF", // 48: TC A1 High Underflow + "TCA1_CMP0/TCA1_LCMP0", // 49: TC A1 Compare 0/TC A1 Low Compare 0 + "TCA1_CMP1/TCA1_LCMP1", // 50: TC A1 Compare 1/TC A1 Low Compare 1 + "TCA1_CMP2/TCA1_LCMP2", // 51: TC A1 Compare 2/TC A1 Low Compare 2 + "ZCD1_ZCD", // 52: Zero Cross Detect 1 + "USART3_RXC", // 53: USART 3 Receive Complete + "USART3_DRE", // 54: USART 3 Data Register Empty + "USART3_TXC", // 55: USART 3 Transmit Complete + "USART4_RXC", // 56: USART 4 Receive Complete + "USART4_DRE", // 57: USART 4 Data Register Empty + "USART4_TXC", // 58: USART 4 Transmit Complete + "UNUSED", // 59: not implemented on this device + "ZCD2_ZCD", // 60: Zero Cross Detect 2 +}; + +const char * const vtab_avr128da64[vts_avr128da64] = { // AVR128DA64, AVR64DA64 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "RTC_CNT", // 3: RTC Counter Interrupt + "RTC_PIT", // 4: RTC Periodic Interrupt Timer + "CCL_CCL", // 5: Configurable Custom Logic + "PORTA_PORT", // 6: Interrupt PORT A + "TCA0_LUNF/TCA0_OVF", // 7: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 8: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 9: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 10: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 11: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 12: TC B0 Interrupt + "TCB1_INT", // 13: TC B1 Interrupt + "TCD0_OVF", // 14: TC D0 Overflow + "TCD0_TRIG", // 15: TC D0 Trigger + "TWI0_TWIS", // 16: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 17: 2-Wire Interface 0 Controller + "SPI0_INT", // 18: SPI 0 Interrupt + "USART0_RXC", // 19: USART 0 Receive Complete + "USART0_DRE", // 20: USART 0 Data Register Empty + "USART0_TXC", // 21: USART 0 Transmit Complete + "PORTD_PORT", // 22: Interrupt PORT D + "AC0_AC", // 23: AC0 AC Interrupt + "ADC0_RESRDY", // 24: ADC 0 Result Ready + "ADC0_WCMP", // 25: ADC 0 Window Comparator + "ZCD0_ZCD", // 26: Zero Cross Detect 0 + "PTC_PTC", // 27: PTC Interrupt + "AC1_AC", // 28: AC1 AC Interrupt + "PORTC_PORT", // 29: Interrupt PORT C + "TCB2_INT", // 30: TC B2 Interrupt + "USART1_RXC", // 31: USART 1 Receive Complete + "USART1_DRE", // 32: USART 1 Data Register Empty + "USART1_TXC", // 33: USART 1 Transmit Complete + "PORTF_PORT", // 34: Interrupt PORT F + "NVMCTRL_EE", // 35: NVM EEPROM + "SPI1_INT", // 36: SPI 1 Interrupt + "USART2_RXC", // 37: USART 2 Receive Complete + "USART2_DRE", // 38: USART 2 Data Register Empty + "USART2_TXC", // 39: USART 2 Transmit Complete + "AC2_AC", // 40: AC2 AC Interrupt + "TCB3_INT", // 41: TC B3 Interrupt + "TWI1_TWIS", // 42: 2-Wire Interface 1 Periphery + "TWI1_TWIM", // 43: 2-Wire Interface 1 Controller + "PORTB_PORT", // 44: Interrupt PORT B + "PORTE_PORT", // 45: Interrupt PORT E + "TCA1_LUNF/TCA1_OVF", // 46: TC A1 Low Underflow/TC A1 Overflow + "TCA1_HUNF", // 47: TC A1 High Underflow + "TCA1_CMP0/TCA1_LCMP0", // 48: TC A1 Compare 0/TC A1 Low Compare 0 + "TCA1_CMP1/TCA1_LCMP1", // 49: TC A1 Compare 1/TC A1 Low Compare 1 + "TCA1_CMP2/TCA1_LCMP2", // 50: TC A1 Compare 2/TC A1 Low Compare 2 + "ZCD1_ZCD", // 51: Zero Cross Detect 1 + "USART3_RXC", // 52: USART 3 Receive Complete + "USART3_DRE", // 53: USART 3 Data Register Empty + "USART3_TXC", // 54: USART 3 Transmit Complete + "USART4_RXC", // 55: USART 4 Receive Complete + "USART4_DRE", // 56: USART 4 Data Register Empty + "USART4_TXC", // 57: USART 4 Transmit Complete + "PORTG_PORT", // 58: Interrupt PORT G + "ZCD2_ZCD", // 59: Zero Cross Detect 2 + "TCB4_INT", // 60: TC B4 Interrupt + "USART5_RXC", // 61: USART 5 Receive Complete + "USART5_DRE", // 62: USART 5 Data Register Empty + "USART5_TXC", // 63: USART 5 Transmit Complete +}; + +const char * const vtab_avr128db64[vts_avr128db64] = { // AVR128DB64, AVR64DB64 + "RESET", // 0: Reset (various reasons) + "CRCSCAN_NMI", // 1: CRCSCAN Non-maskable Interrupt + "BOD_VLM", // 2: Brown-out Detector Voltage Level Monitor + "CLKCTRL_CFD", // 3: Clock Failure Detection + "MVIO_MVIO", // 4: Multi-Voltage I/O + "RTC_CNT", // 5: RTC Counter Interrupt + "RTC_PIT", // 6: RTC Periodic Interrupt Timer + "CCL_CCL", // 7: Configurable Custom Logic + "PORTA_PORT", // 8: Interrupt PORT A + "TCA0_LUNF/TCA0_OVF", // 9: TC A0 Low Underflow/TC A0 Overflow + "TCA0_HUNF", // 10: TC A0 High Underflow + "TCA0_CMP0/TCA0_LCMP0", // 11: TC A0 Compare 0/TC A0 Low Compare 0 + "TCA0_CMP1/TCA0_LCMP1", // 12: TC A0 Compare 1/TC A0 Low Compare 1 + "TCA0_CMP2/TCA0_LCMP2", // 13: TC A0 Compare 2/TC A0 Low Compare 2 + "TCB0_INT", // 14: TC B0 Interrupt + "TCB1_INT", // 15: TC B1 Interrupt + "TCD0_OVF", // 16: TC D0 Overflow + "TCD0_TRIG", // 17: TC D0 Trigger + "TWI0_TWIS", // 18: 2-Wire Interface 0 Periphery + "TWI0_TWIM", // 19: 2-Wire Interface 0 Controller + "SPI0_INT", // 20: SPI 0 Interrupt + "USART0_RXC", // 21: USART 0 Receive Complete + "USART0_DRE", // 22: USART 0 Data Register Empty + "USART0_TXC", // 23: USART 0 Transmit Complete + "PORTD_PORT", // 24: Interrupt PORT D + "AC0_AC", // 25: AC0 AC Interrupt + "ADC0_RESRDY", // 26: ADC 0 Result Ready + "ADC0_WCMP", // 27: ADC 0 Window Comparator + "ZCD0_ZCD", // 28: Zero Cross Detect 0 + "AC1_AC", // 29: AC1 AC Interrupt + "PORTC_PORT", // 30: Interrupt PORT C + "TCB2_INT", // 31: TC B2 Interrupt + "USART1_RXC", // 32: USART 1 Receive Complete + "USART1_DRE", // 33: USART 1 Data Register Empty + "USART1_TXC", // 34: USART 1 Transmit Complete + "PORTF_PORT", // 35: Interrupt PORT F + "NVMCTRL_EE", // 36: NVM EEPROM + "SPI1_INT", // 37: SPI 1 Interrupt + "USART2_RXC", // 38: USART 2 Receive Complete + "USART2_DRE", // 39: USART 2 Data Register Empty + "USART2_TXC", // 40: USART 2 Transmit Complete + "AC2_AC", // 41: AC2 AC Interrupt + "TWI1_TWIS", // 42: 2-Wire Interface 1 Periphery + "TWI1_TWIM", // 43: 2-Wire Interface 1 Controller + "TCB3_INT", // 44: TC B3 Interrupt + "PORTB_PORT", // 45: Interrupt PORT B + "PORTE_PORT", // 46: Interrupt PORT E + "TCA1_LUNF/TCA1_OVF", // 47: TC A1 Low Underflow/TC A1 Overflow + "TCA1_HUNF", // 48: TC A1 High Underflow + "TCA1_CMP0/TCA1_LCMP0", // 49: TC A1 Compare 0/TC A1 Low Compare 0 + "TCA1_CMP1/TCA1_LCMP1", // 50: TC A1 Compare 1/TC A1 Low Compare 1 + "TCA1_CMP2/TCA1_LCMP2", // 51: TC A1 Compare 2/TC A1 Low Compare 2 + "ZCD1_ZCD", // 52: Zero Cross Detect 1 + "USART3_RXC", // 53: USART 3 Receive Complete + "USART3_DRE", // 54: USART 3 Data Register Empty + "USART3_TXC", // 55: USART 3 Transmit Complete + "USART4_RXC", // 56: USART 4 Receive Complete + "USART4_DRE", // 57: USART 4 Data Register Empty + "USART4_TXC", // 58: USART 4 Transmit Complete + "PORTG_PORT", // 59: Interrupt PORT G + "ZCD2_ZCD", // 60: Zero Cross Detect 2 + "TCB4_INT", // 61: TC B4 Interrupt + "USART5_RXC", // 62: USART 5 Receive Complete + "USART5_DRE", // 63: USART 5 Data Register Empty + "USART5_TXC", // 64: USART 5 Transmit Complete +}; + diff --git a/src/avrintel.h b/src/avrintel.h new file mode 100644 index 00000000..d8bc07ec --- /dev/null +++ b/src/avrintel.h @@ -0,0 +1,1477 @@ +/* + * Do not edit: automatically generated by mkavrintel.pl + * + * avrintel.h + * + * Atmel AVR8L, AVR8, XMEGA and AVR8X family description of interrupts and more + * + * published under GNU General Public License, version 3 (GPL-3.0) + * meta-author Stefan Rueger + * + * v 1.1 + * 30.08.2022 + * + */ + +#ifndef AVRINTEL_H +#define AVRINTEL_H + +#include "config.h" + +typedef struct { // Value of -1 typically means unknown + const char *name; // Name of part + uint16_t mcuid; // ID of MCU in 0..2039 + uint8_t avrarch; // F_AVR8L, F_AVR8, F_XMEGA or F_AVR8X + uint8_t sigs[3]; // Signature bytes + int32_t flashoffset; // Flash offset + int32_t flashsize; // Flash size + int16_t pagesize; // Flash page size + int8_t nboots; // Number of supported boot sectors + int16_t bootsize; // Size of (smallest) boot sector + int32_t eepromoffset; // EEPROM offset + int32_t eepromsize; // EEPROM size + int32_t eeprompagesize; // EEPROM page size + int32_t sramstart; // SRAM offset + int32_t sramsize; // SRAM size + int8_t nfuses; // Number of fuse bytes + int8_t nlocks; // Number of lock bytes + uint8_t ninterrupts; // Number of vectors in interrupt vector table + const char * const *isrtable; // Interrupt vector table vector names +} uPcore_t; + +#define F_AVR8L 1 // TPI programming, ATtiny(4|5|9|10|20|40|102|104) +#define F_AVR8 2 // ISP programming with SPI, "classic" AVRs +#define F_XMEGA 4 // PDI programming, ATxmega family +#define F_AVR8X 8 // UPDI programming, newer 8-bit MCUs + +#define UB_N_MCU 2040 // mcuid is in 0..2039 + +// MCU id: running number in arbitrary order; once assigned never change for backward compatibility +#define id_attiny4 0u +#define id_attiny5 1u +#define id_attiny9 2u +#define id_attiny10 3u +#define id_attiny20 4u +#define id_attiny40 5u +#define id_attiny102 6u +#define id_attiny104 7u +#define id_attiny11 8u +#define id_attiny12 9u +#define id_attiny13 10u +#define id_attiny13a 11u +#define id_attiny15 12u +#define id_attiny22 13u +#define id_attiny24 14u +#define id_attiny24a 15u +#define id_attiny25 16u +#define id_attiny26 17u +#define id_attiny28 18u +#define id_attiny43u 19u +#define id_attiny44 20u +#define id_attiny44a 21u +#define id_attiny45 22u +#define id_attiny48 23u +#define id_attiny84 24u +#define id_attiny84a 25u +#define id_attiny85 26u +#define id_attiny87 27u +#define id_attiny88 28u +#define id_attiny167 29u +#define id_attiny261 30u +#define id_attiny261a 31u +#define id_attiny441 32u +#define id_attiny461 33u +#define id_attiny461a 34u +#define id_attiny828 35u +#define id_attiny828r 36u +#define id_attiny841 37u +#define id_attiny861 38u +#define id_attiny861a 39u +#define id_attiny1634 40u +#define id_attiny1634r 41u +#define id_attiny2313 42u +#define id_attiny2313a 43u +#define id_attiny4313 44u +#define id_atmega8 45u +#define id_atmega8a 46u +#define id_atmega8hva 47u +#define id_atmega8u2 48u +#define id_atmega16 49u +#define id_atmega16a 50u +#define id_atmega16hva 51u +#define id_atmega16hvb 52u +#define id_atmega16hvbrevb 53u +#define id_atmega16m1 54u +#define id_atmega16hva2 55u +#define id_atmega16u2 56u +#define id_atmega16u4 57u +#define id_atmega32 58u +#define id_atmega32a 59u +#define id_atmega32hvb 60u +#define id_atmega32hvbrevb 61u +#define id_atmega32c1 62u +#define id_atmega32m1 63u +#define id_atmega32u2 64u +#define id_atmega32u4 65u +#define id_atmega32u6 66u +#define id_atmega48 67u +#define id_atmega48a 68u +#define id_atmega48p 69u +#define id_atmega48pa 70u +#define id_atmega48pb 71u +#define id_atmega64 72u +#define id_atmega64a 73u +#define id_atmega64hve 74u +#define id_atmega64c1 75u +#define id_atmega64m1 76u +#define id_atmega64hve2 77u +#define id_atmega64rfr2 78u +#define id_atmega88 79u +#define id_atmega88a 80u +#define id_atmega88p 81u +#define id_atmega88pa 82u +#define id_atmega88pb 83u +#define id_atmega103 84u +#define id_atmega128 85u +#define id_atmega128a 86u +#define id_atmega128rfa1 87u +#define id_atmega128rfr2 88u +#define id_atmega161 89u +#define id_atmega162 90u +#define id_atmega163 91u +#define id_atmega164a 92u +#define id_atmega164p 93u +#define id_atmega164pa 94u +#define id_atmega165 95u +#define id_atmega165a 96u +#define id_atmega165p 97u +#define id_atmega165pa 98u +#define id_atmega168 99u +#define id_atmega168a 100u +#define id_atmega168p 101u +#define id_atmega168pa 102u +#define id_atmega168pb 103u +#define id_atmega169 104u +#define id_atmega169a 105u +#define id_atmega169p 106u +#define id_atmega169pa 107u +#define id_atmega256rfr2 108u +#define id_atmega323 109u +#define id_atmega324a 110u +#define id_atmega324p 111u +#define id_atmega324pa 112u +#define id_atmega324pb 113u +#define id_atmega325 114u +#define id_atmega325a 115u +#define id_atmega325p 116u +#define id_atmega325pa 117u +#define id_atmega328 118u +#define id_atmega328p 119u +#define id_atmega328pb 120u +#define id_atmega329 121u +#define id_atmega329a 122u +#define id_atmega329p 123u +#define id_atmega329pa 124u +#define id_atmega406 125u +#define id_atmega640 126u +#define id_atmega644 127u +#define id_atmega644a 128u +#define id_atmega644p 129u +#define id_atmega644pa 130u +#define id_atmega644rfr2 131u +#define id_atmega645 132u +#define id_atmega645a 133u +#define id_atmega645p 134u +#define id_atmega649 135u +#define id_atmega649a 136u +#define id_atmega649p 137u +#define id_atmega1280 138u +#define id_atmega1281 139u +#define id_atmega1284 140u +#define id_atmega1284p 141u +#define id_atmega1284rfr2 142u +#define id_atmega2560 143u +#define id_atmega2561 144u +#define id_atmega2564rfr2 145u +#define id_atmega3250 146u +#define id_atmega3250a 147u +#define id_atmega3250p 148u +#define id_atmega3250pa 149u +#define id_atmega3290 150u +#define id_atmega3290a 151u +#define id_atmega3290p 152u +#define id_atmega3290pa 153u +#define id_atmega6450 154u +#define id_atmega6450a 155u +#define id_atmega6450p 156u +#define id_atmega6490 157u +#define id_atmega6490a 158u +#define id_atmega6490p 159u +#define id_atmega8515 160u +#define id_atmega8535 161u +#define id_at43usb320 162u +#define id_at43usb355 163u +#define id_at76c711 164u +#define id_at86rf401 165u +#define id_at90pwm1 166u +#define id_at90pwm2 167u +#define id_at90pwm2b 168u +#define id_at90pwm3 169u +#define id_at90pwm3b 170u +#define id_at90can32 171u +#define id_at90can64 172u +#define id_at90pwm81 173u +#define id_at90usb82 174u +#define id_at90scr100 175u +#define id_at90can128 176u +#define id_at90pwm161 177u +#define id_at90usb162 178u +#define id_at90pwm216 179u +#define id_at90pwm316 180u +#define id_at90usb646 181u +#define id_at90usb647 182u +#define id_at90s1200 183u +#define id_at90usb1286 184u +#define id_at90usb1287 185u +#define id_at90s2313 186u +#define id_at90s2323 187u +#define id_at90s2333 188u +#define id_at90s2343 189u +#define id_at90s4414 190u +#define id_at90s4433 191u +#define id_at90s4434 192u +#define id_at90s8515 193u +#define id_at90c8534 194u +#define id_at90s8535 195u +#define id_at94k 196u +#define id_ata5272 197u +#define id_ata5505 198u +#define id_ata5700m322 199u +#define id_ata5702m322 200u +#define id_ata5781 201u +#define id_ata5782 202u +#define id_ata5783 203u +#define id_ata5787 204u +#define id_ata5790 205u +#define id_ata5790n 206u +#define id_ata5791 207u +#define id_ata5795 208u +#define id_ata5831 209u +#define id_ata5832 210u +#define id_ata5833 211u +#define id_ata5835 212u +#define id_ata6285 213u +#define id_ata6286 214u +#define id_ata6289 215u +#define id_ata6612c 216u +#define id_ata6613c 217u +#define id_ata6614q 218u +#define id_ata6616c 219u +#define id_ata6617c 220u +#define id_ata8210 221u +#define id_ata8215 222u +#define id_ata8510 223u +#define id_ata8515 224u +#define id_ata664251 225u +#define id_m3000 226u +#define id_lgt8f88p 227u +#define id_lgt8f168p 228u +#define id_lgt8f328p 229u +#define id_atxmega8e5 230u +#define id_atxmega16a4 231u +#define id_atxmega16a4u 232u +#define id_atxmega16c4 233u +#define id_atxmega16d4 234u +#define id_atxmega16e5 235u +#define id_atxmega32c3 236u +#define id_atxmega32d3 237u +#define id_atxmega32a4 238u +#define id_atxmega32a4u 239u +#define id_atxmega32c4 240u +#define id_atxmega32d4 241u +#define id_atxmega32e5 242u +#define id_atxmega64a1 243u +#define id_atxmega64a1u 244u +#define id_atxmega64b1 245u +#define id_atxmega64a3 246u +#define id_atxmega64a3u 247u +#define id_atxmega64b3 248u +#define id_atxmega64c3 249u +#define id_atxmega64d3 250u +#define id_atxmega64a4 251u +#define id_atxmega64a4u 252u +#define id_atxmega64d4 253u +#define id_atxmega128a1 254u +#define id_atxmega128a1revd 255u +#define id_atxmega128a1u 256u +#define id_atxmega128b1 257u +#define id_atxmega128a3 258u +#define id_atxmega128a3u 259u +#define id_atxmega128b3 260u +#define id_atxmega128c3 261u +#define id_atxmega128d3 262u +#define id_atxmega128a4 263u +#define id_atxmega128a4u 264u +#define id_atxmega128d4 265u +#define id_atxmega192a1 266u +#define id_atxmega192a3 267u +#define id_atxmega192a3u 268u +#define id_atxmega192c3 269u +#define id_atxmega192d3 270u +#define id_atxmega256a1 271u +#define id_atxmega256a3 272u +#define id_atxmega256a3b 273u +#define id_atxmega256a3bu 274u +#define id_atxmega256a3u 275u +#define id_atxmega256c3 276u +#define id_atxmega256d3 277u +#define id_atxmega384c3 278u +#define id_atxmega384d3 279u +#define id_attiny202 280u +#define id_attiny204 281u +#define id_attiny212 282u +#define id_attiny214 283u +#define id_attiny402 284u +#define id_attiny404 285u +#define id_attiny406 286u +#define id_attiny412 287u +#define id_attiny414 288u +#define id_attiny416 289u +#define id_attiny416auto 290u +#define id_attiny417 291u +#define id_attiny424 292u +#define id_attiny426 293u +#define id_attiny427 294u +#define id_attiny804 295u +#define id_attiny806 296u +#define id_attiny807 297u +#define id_attiny814 298u +#define id_attiny816 299u +#define id_attiny817 300u +#define id_attiny824 301u +#define id_attiny826 302u +#define id_attiny827 303u +#define id_attiny1604 304u +#define id_attiny1606 305u +#define id_attiny1607 306u +#define id_attiny1614 307u +#define id_attiny1616 308u +#define id_attiny1617 309u +#define id_attiny1624 310u +#define id_attiny1626 311u +#define id_attiny1627 312u +#define id_attiny3214 313u +#define id_attiny3216 314u +#define id_attiny3217 315u +#define id_attiny3224 316u +#define id_attiny3226 317u +#define id_attiny3227 318u +#define id_atmega808 319u +#define id_atmega809 320u +#define id_atmega1608 321u +#define id_atmega1609 322u +#define id_atmega3208 323u +#define id_atmega3209 324u +#define id_atmega4808 325u +#define id_atmega4809 326u +#define id_avr8ea28 327u +#define id_avr8ea32 328u +#define id_avr16dd14 329u +#define id_avr16dd20 330u +#define id_avr16dd28 331u +#define id_avr16ea28 332u +#define id_avr16dd32 333u +#define id_avr16ea32 334u +#define id_avr16ea48 335u +#define id_avr32dd14 336u +#define id_avr32dd20 337u +#define id_avr32da28 338u +#define id_avr32db28 339u +#define id_avr32dd28 340u +#define id_avr32ea28 341u +#define id_avr32da32 342u +#define id_avr32db32 343u +#define id_avr32dd32 344u +#define id_avr32ea32 345u +#define id_avr32da48 346u +#define id_avr32db48 347u +#define id_avr32ea48 348u +#define id_avr64dd14 349u +#define id_avr64dd20 350u +#define id_avr64da28 351u +#define id_avr64db28 352u +#define id_avr64dd28 353u +#define id_avr64ea28 354u +#define id_avr64da32 355u +#define id_avr64db32 356u +#define id_avr64dd32 357u +#define id_avr64ea32 358u +#define id_avr64da48 359u +#define id_avr64db48 360u +#define id_avr64ea48 361u +#define id_avr64da64 362u +#define id_avr64db64 363u +#define id_avr128da28 364u +#define id_avr128db28 365u +#define id_avr128da32 366u +#define id_avr128db32 367u +#define id_avr128da48 368u +#define id_avr128db48 369u +#define id_avr128da64 370u +#define id_avr128db64 371u + +// Interrupt vector table sizes (number of vectors) +#define vts_attiny4 10 +#define vts_attiny5 11 +#define vts_attiny9 10 +#define vts_attiny10 11 +#define vts_attiny20 17 +#define vts_attiny40 18 +#define vts_attiny102 16 +#define vts_attiny104 16 +#define vts_attiny11 5 +#define vts_attiny12 6 +#define vts_attiny13 10 +#define vts_attiny13a 10 +#define vts_attiny15 9 +#define vts_attiny22 3 +#define vts_attiny24 17 +#define vts_attiny24a 17 +#define vts_attiny25 15 +#define vts_attiny26 12 +#define vts_attiny28 6 +#define vts_attiny43u 16 +#define vts_attiny44 17 +#define vts_attiny44a 17 +#define vts_attiny45 15 +#define vts_attiny48 20 +#define vts_attiny84 17 +#define vts_attiny84a 17 +#define vts_attiny85 15 +#define vts_attiny87 20 +#define vts_attiny88 20 +#define vts_attiny167 20 +#define vts_attiny261 19 +#define vts_attiny261a 19 +#define vts_attiny441 30 +#define vts_attiny461 19 +#define vts_attiny461a 19 +#define vts_attiny828 26 +#define vts_attiny841 30 +#define vts_attiny861 19 +#define vts_attiny861a 19 +#define vts_attiny1634 28 +#define vts_attiny2313 19 +#define vts_attiny2313a 21 +#define vts_attiny4313 21 +#define vts_atmega8 19 +#define vts_atmega8a 19 +#define vts_atmega8hva 21 +#define vts_atmega8u2 29 +#define vts_atmega16 21 +#define vts_atmega16a 21 +#define vts_atmega16hva 21 +#define vts_atmega16hvb 29 +#define vts_atmega16hvbrevb 29 +#define vts_atmega16m1 31 +#define vts_atmega16hva2 22 +#define vts_atmega16u2 29 +#define vts_atmega16u4 43 +#define vts_atmega32 21 +#define vts_atmega32a 21 +#define vts_atmega32hvb 29 +#define vts_atmega32hvbrevb 29 +#define vts_atmega32c1 31 +#define vts_atmega32m1 31 +#define vts_atmega32u2 29 +#define vts_atmega32u4 43 +#define vts_atmega32u6 38 +#define vts_atmega48 26 +#define vts_atmega48a 26 +#define vts_atmega48p 26 +#define vts_atmega48pa 26 +#define vts_atmega48pb 27 +#define vts_atmega64 35 +#define vts_atmega64a 35 +#define vts_atmega64hve 25 +#define vts_atmega64c1 31 +#define vts_atmega64m1 31 +#define vts_atmega64hve2 25 +#define vts_atmega64rfr2 77 +#define vts_atmega88 26 +#define vts_atmega88a 26 +#define vts_atmega88p 26 +#define vts_atmega88pa 26 +#define vts_atmega88pb 27 +#define vts_atmega103 24 +#define vts_atmega128 35 +#define vts_atmega128a 35 +#define vts_atmega128rfa1 72 +#define vts_atmega128rfr2 77 +#define vts_atmega161 21 +#define vts_atmega162 28 +#define vts_atmega163 18 +#define vts_atmega164a 31 +#define vts_atmega164p 31 +#define vts_atmega164pa 31 +#define vts_atmega165 22 +#define vts_atmega165a 22 +#define vts_atmega165p 22 +#define vts_atmega165pa 22 +#define vts_atmega168 26 +#define vts_atmega168a 26 +#define vts_atmega168p 26 +#define vts_atmega168pa 26 +#define vts_atmega168pb 27 +#define vts_atmega169 23 +#define vts_atmega169a 23 +#define vts_atmega169p 23 +#define vts_atmega169pa 23 +#define vts_atmega256rfr2 77 +#define vts_atmega323 21 +#define vts_atmega324a 31 +#define vts_atmega324p 31 +#define vts_atmega324pa 31 +#define vts_atmega324pb 51 +#define vts_atmega325 22 +#define vts_atmega325a 22 +#define vts_atmega325p 22 +#define vts_atmega325pa 22 +#define vts_atmega328 26 +#define vts_atmega328p 26 +#define vts_atmega328pb 45 +#define vts_atmega329 23 +#define vts_atmega329a 23 +#define vts_atmega329p 23 +#define vts_atmega329pa 23 +#define vts_atmega406 23 +#define vts_atmega640 57 +#define vts_atmega644 28 +#define vts_atmega644a 31 +#define vts_atmega644p 31 +#define vts_atmega644pa 31 +#define vts_atmega644rfr2 77 +#define vts_atmega645 22 +#define vts_atmega645a 22 +#define vts_atmega645p 22 +#define vts_atmega649 23 +#define vts_atmega649a 23 +#define vts_atmega649p 23 +#define vts_atmega1280 57 +#define vts_atmega1281 57 +#define vts_atmega1284 35 +#define vts_atmega1284p 35 +#define vts_atmega1284rfr2 77 +#define vts_atmega2560 57 +#define vts_atmega2561 57 +#define vts_atmega2564rfr2 77 +#define vts_atmega3250 25 +#define vts_atmega3250a 25 +#define vts_atmega3250p 25 +#define vts_atmega3250pa 25 +#define vts_atmega3290 25 +#define vts_atmega3290a 25 +#define vts_atmega3290p 25 +#define vts_atmega3290pa 25 +#define vts_atmega6450 25 +#define vts_atmega6450a 25 +#define vts_atmega6450p 25 +#define vts_atmega6490 25 +#define vts_atmega6490a 25 +#define vts_atmega6490p 25 +#define vts_atmega8515 17 +#define vts_atmega8535 21 +#define vts_at86rf401 3 +#define vts_at90pwm1 32 +#define vts_at90pwm2 32 +#define vts_at90pwm2b 32 +#define vts_at90pwm3 32 +#define vts_at90pwm3b 32 +#define vts_at90can32 37 +#define vts_at90can64 37 +#define vts_at90pwm81 20 +#define vts_at90usb82 29 +#define vts_at90scr100 38 +#define vts_at90can128 37 +#define vts_at90pwm161 20 +#define vts_at90usb162 29 +#define vts_at90pwm216 32 +#define vts_at90pwm316 32 +#define vts_at90usb646 38 +#define vts_at90usb647 38 +#define vts_at90s1200 4 +#define vts_at90usb1286 38 +#define vts_at90usb1287 38 +#define vts_at90s2313 11 +#define vts_at90s2323 3 +#define vts_at90s2333 14 +#define vts_at90s2343 3 +#define vts_at90s4414 13 +#define vts_at90s4433 14 +#define vts_at90s4434 17 +#define vts_at90s8515 13 +#define vts_at90s8535 17 +#define vts_ata5272 37 +#define vts_ata5505 20 +#define vts_ata5700m322 51 +#define vts_ata5702m322 51 +#define vts_ata5781 42 +#define vts_ata5782 42 +#define vts_ata5783 42 +#define vts_ata5787 44 +#define vts_ata5790 30 +#define vts_ata5790n 31 +#define vts_ata5791 31 +#define vts_ata5795 23 +#define vts_ata5831 42 +#define vts_ata5832 42 +#define vts_ata5833 42 +#define vts_ata5835 44 +#define vts_ata6285 27 +#define vts_ata6286 27 +#define vts_ata6289 27 +#define vts_ata6612c 26 +#define vts_ata6613c 26 +#define vts_ata6614q 26 +#define vts_ata6616c 20 +#define vts_ata6617c 20 +#define vts_ata8210 42 +#define vts_ata8215 42 +#define vts_ata8510 42 +#define vts_ata8515 42 +#define vts_ata664251 20 +#define vts_atxmega8e5 43 +#define vts_atxmega16a4 94 +#define vts_atxmega16a4u 127 +#define vts_atxmega16c4 127 +#define vts_atxmega16d4 91 +#define vts_atxmega16e5 43 +#define vts_atxmega32c3 127 +#define vts_atxmega32d3 114 +#define vts_atxmega32a4 94 +#define vts_atxmega32a4u 127 +#define vts_atxmega32c4 127 +#define vts_atxmega32d4 91 +#define vts_atxmega32e5 43 +#define vts_atxmega64a1 125 +#define vts_atxmega64a1u 127 +#define vts_atxmega64b1 81 +#define vts_atxmega64a3 122 +#define vts_atxmega64a3u 127 +#define vts_atxmega64b3 54 +#define vts_atxmega64c3 127 +#define vts_atxmega64d3 114 +#define vts_atxmega64a4u 127 +#define vts_atxmega64d4 91 +#define vts_atxmega128a1 125 +#define vts_atxmega128a1u 127 +#define vts_atxmega128b1 81 +#define vts_atxmega128a3 122 +#define vts_atxmega128a3u 127 +#define vts_atxmega128b3 54 +#define vts_atxmega128c3 127 +#define vts_atxmega128d3 114 +#define vts_atxmega128a4u 127 +#define vts_atxmega128d4 91 +#define vts_atxmega192a3 122 +#define vts_atxmega192a3u 127 +#define vts_atxmega192c3 127 +#define vts_atxmega192d3 114 +#define vts_atxmega256a3 122 +#define vts_atxmega256a3b 122 +#define vts_atxmega256a3bu 127 +#define vts_atxmega256a3u 127 +#define vts_atxmega256c3 127 +#define vts_atxmega256d3 114 +#define vts_atxmega384c3 127 +#define vts_atxmega384d3 114 +#define vts_attiny202 26 +#define vts_attiny204 26 +#define vts_attiny212 26 +#define vts_attiny214 26 +#define vts_attiny402 26 +#define vts_attiny404 26 +#define vts_attiny406 26 +#define vts_attiny412 26 +#define vts_attiny414 26 +#define vts_attiny416 26 +#define vts_attiny416auto 26 +#define vts_attiny417 26 +#define vts_attiny424 30 +#define vts_attiny426 30 +#define vts_attiny427 30 +#define vts_attiny804 31 +#define vts_attiny806 31 +#define vts_attiny807 31 +#define vts_attiny814 26 +#define vts_attiny816 26 +#define vts_attiny817 26 +#define vts_attiny824 30 +#define vts_attiny826 30 +#define vts_attiny827 30 +#define vts_attiny1604 31 +#define vts_attiny1606 31 +#define vts_attiny1607 31 +#define vts_attiny1614 31 +#define vts_attiny1616 31 +#define vts_attiny1617 31 +#define vts_attiny1624 30 +#define vts_attiny1626 30 +#define vts_attiny1627 30 +#define vts_attiny3214 31 +#define vts_attiny3216 31 +#define vts_attiny3217 31 +#define vts_attiny3224 30 +#define vts_attiny3226 30 +#define vts_attiny3227 30 +#define vts_atmega808 36 +#define vts_atmega809 40 +#define vts_atmega1608 36 +#define vts_atmega1609 40 +#define vts_atmega3208 36 +#define vts_atmega3209 40 +#define vts_atmega4808 36 +#define vts_atmega4809 40 +#define vts_avr16dd14 36 +#define vts_avr16dd20 36 +#define vts_avr16dd28 36 +#define vts_avr16dd32 36 +#define vts_avr32dd14 36 +#define vts_avr32dd20 36 +#define vts_avr32da28 41 +#define vts_avr32db28 42 +#define vts_avr32dd28 36 +#define vts_avr32da32 44 +#define vts_avr32db32 44 +#define vts_avr32dd32 36 +#define vts_avr32da48 58 +#define vts_avr32db48 61 +#define vts_avr64dd14 36 +#define vts_avr64dd20 36 +#define vts_avr64da28 41 +#define vts_avr64db28 42 +#define vts_avr64dd28 36 +#define vts_avr64ea28 37 +#define vts_avr64da32 44 +#define vts_avr64db32 44 +#define vts_avr64dd32 36 +#define vts_avr64ea32 37 +#define vts_avr64da48 58 +#define vts_avr64db48 61 +#define vts_avr64ea48 45 +#define vts_avr64da64 64 +#define vts_avr64db64 65 +#define vts_avr128da28 41 +#define vts_avr128db28 42 +#define vts_avr128da32 44 +#define vts_avr128db32 44 +#define vts_avr128da48 58 +#define vts_avr128db48 61 +#define vts_avr128da64 64 +#define vts_avr128db64 65 + +// Suggested vector bootloader interrupt number (first unused vector or, failing that, slot just above vector table) +#define vbu_attiny4 10 +#define vbu_attiny5 11 +#define vbu_attiny9 10 +#define vbu_attiny10 11 +#define vbu_attiny20 17 +#define vbu_attiny40 18 +#define vbu_attiny102 16 +#define vbu_attiny104 16 +#define vbu_attiny11 5 +#define vbu_attiny12 6 +#define vbu_attiny13 10 +#define vbu_attiny13a 10 +#define vbu_attiny15 9 +#define vbu_attiny22 3 +#define vbu_attiny24 17 +#define vbu_attiny24a 17 +#define vbu_attiny25 15 +#define vbu_attiny26 12 +#define vbu_attiny28 6 +#define vbu_attiny43u 16 +#define vbu_attiny44 17 +#define vbu_attiny44a 17 +#define vbu_attiny45 15 +#define vbu_attiny48 20 +#define vbu_attiny84 17 +#define vbu_attiny84a 17 +#define vbu_attiny85 15 +#define vbu_attiny87 20 +#define vbu_attiny88 20 +#define vbu_attiny167 20 +#define vbu_attiny261 19 +#define vbu_attiny261a 19 +#define vbu_attiny441 30 +#define vbu_attiny461 19 +#define vbu_attiny461a 19 +#define vbu_attiny828 26 +#define vbu_attiny841 30 +#define vbu_attiny861 19 +#define vbu_attiny861a 19 +#define vbu_attiny1634 28 +#define vbu_attiny2313 19 +#define vbu_attiny2313a 21 +#define vbu_attiny4313 21 +#define vbu_atmega8 19 +#define vbu_atmega8a 19 +#define vbu_atmega8hva 21 +#define vbu_atmega8u2 29 +#define vbu_atmega16 21 +#define vbu_atmega16a 21 +#define vbu_atmega16hva 21 +#define vbu_atmega16hvb 29 +#define vbu_atmega16hvbrevb 29 +#define vbu_atmega16m1 31 +#define vbu_atmega16hva2 22 +#define vbu_atmega16u2 29 +#define vbu_atmega16u4 43 +#define vbu_atmega32 21 +#define vbu_atmega32a 21 +#define vbu_atmega32hvb 29 +#define vbu_atmega32hvbrevb 29 +#define vbu_atmega32c1 31 +#define vbu_atmega32m1 31 +#define vbu_atmega32u2 29 +#define vbu_atmega32u4 43 +#define vbu_atmega32u6 38 +#define vbu_atmega48 26 +#define vbu_atmega48a 26 +#define vbu_atmega48p 26 +#define vbu_atmega48pa 26 +#define vbu_atmega48pb 27 +#define vbu_atmega64 35 +#define vbu_atmega64a 35 +#define vbu_atmega64hve 25 +#define vbu_atmega64c1 31 +#define vbu_atmega64m1 31 +#define vbu_atmega64hve2 25 +#define vbu_atmega64rfr2 77 +#define vbu_atmega88 26 +#define vbu_atmega88a 26 +#define vbu_atmega88p 26 +#define vbu_atmega88pa 26 +#define vbu_atmega88pb 27 +#define vbu_atmega103 24 +#define vbu_atmega128 35 +#define vbu_atmega128a 35 +#define vbu_atmega128rfa1 72 +#define vbu_atmega128rfr2 77 +#define vbu_atmega161 21 +#define vbu_atmega162 28 +#define vbu_atmega163 18 +#define vbu_atmega164a 31 +#define vbu_atmega164p 31 +#define vbu_atmega164pa 31 +#define vbu_atmega165 22 +#define vbu_atmega165a 22 +#define vbu_atmega165p 22 +#define vbu_atmega165pa 22 +#define vbu_atmega168 26 +#define vbu_atmega168a 26 +#define vbu_atmega168p 26 +#define vbu_atmega168pa 26 +#define vbu_atmega168pb 27 +#define vbu_atmega169 23 +#define vbu_atmega169a 23 +#define vbu_atmega169p 23 +#define vbu_atmega169pa 23 +#define vbu_atmega256rfr2 77 +#define vbu_atmega323 21 +#define vbu_atmega324a 31 +#define vbu_atmega324p 31 +#define vbu_atmega324pa 31 +#define vbu_atmega324pb 51 +#define vbu_atmega325 22 +#define vbu_atmega325a 22 +#define vbu_atmega325p 22 +#define vbu_atmega325pa 22 +#define vbu_atmega328 26 +#define vbu_atmega328p 26 +#define vbu_atmega328pb 45 +#define vbu_atmega329 23 +#define vbu_atmega329a 23 +#define vbu_atmega329p 23 +#define vbu_atmega329pa 23 +#define vbu_atmega406 23 +#define vbu_atmega640 57 +#define vbu_atmega644 28 +#define vbu_atmega644a 31 +#define vbu_atmega644p 31 +#define vbu_atmega644pa 31 +#define vbu_atmega644rfr2 77 +#define vbu_atmega645 22 +#define vbu_atmega645a 22 +#define vbu_atmega645p 22 +#define vbu_atmega649 23 +#define vbu_atmega649a 23 +#define vbu_atmega649p 23 +#define vbu_atmega1280 57 +#define vbu_atmega1281 57 +#define vbu_atmega1284 35 +#define vbu_atmega1284p 35 +#define vbu_atmega1284rfr2 77 +#define vbu_atmega2560 57 +#define vbu_atmega2561 57 +#define vbu_atmega2564rfr2 77 +#define vbu_atmega3250 25 +#define vbu_atmega3250a 25 +#define vbu_atmega3250p 25 +#define vbu_atmega3250pa 25 +#define vbu_atmega3290 25 +#define vbu_atmega3290a 25 +#define vbu_atmega3290p 25 +#define vbu_atmega3290pa 25 +#define vbu_atmega6450 25 +#define vbu_atmega6450a 25 +#define vbu_atmega6450p 25 +#define vbu_atmega6490 25 +#define vbu_atmega6490a 25 +#define vbu_atmega6490p 25 +#define vbu_atmega8515 17 +#define vbu_atmega8535 21 +#define vbu_at86rf401 3 +#define vbu_at90pwm1 32 +#define vbu_at90pwm2 14 +#define vbu_at90pwm2b 32 +#define vbu_at90pwm3 32 +#define vbu_at90pwm3b 32 +#define vbu_at90can32 37 +#define vbu_at90can64 37 +#define vbu_at90pwm81 20 +#define vbu_at90usb82 29 +#define vbu_at90scr100 38 +#define vbu_at90can128 37 +#define vbu_at90pwm161 20 +#define vbu_at90usb162 29 +#define vbu_at90pwm216 32 +#define vbu_at90pwm316 32 +#define vbu_at90usb646 38 +#define vbu_at90usb647 38 +#define vbu_at90s1200 4 +#define vbu_at90usb1286 38 +#define vbu_at90usb1287 38 +#define vbu_at90s2313 11 +#define vbu_at90s2323 3 +#define vbu_at90s2333 14 +#define vbu_at90s2343 3 +#define vbu_at90s4414 13 +#define vbu_at90s4433 14 +#define vbu_at90s4434 17 +#define vbu_at90s8515 13 +#define vbu_at90s8535 17 +#define vbu_ata5272 17 +#define vbu_ata5505 20 +#define vbu_ata5700m322 51 +#define vbu_ata5702m322 51 +#define vbu_ata5781 42 +#define vbu_ata5782 42 +#define vbu_ata5783 42 +#define vbu_ata5787 44 +#define vbu_ata5790 30 +#define vbu_ata5790n 31 +#define vbu_ata5791 31 +#define vbu_ata5795 23 +#define vbu_ata5831 42 +#define vbu_ata5832 42 +#define vbu_ata5833 42 +#define vbu_ata5835 44 +#define vbu_ata6285 27 +#define vbu_ata6286 27 +#define vbu_ata6289 27 +#define vbu_ata6612c 26 +#define vbu_ata6613c 26 +#define vbu_ata6614q 26 +#define vbu_ata6616c 20 +#define vbu_ata6617c 20 +#define vbu_ata8210 42 +#define vbu_ata8215 42 +#define vbu_ata8510 42 +#define vbu_ata8515 42 +#define vbu_ata664251 20 +#define vbu_atxmega8e5 43 +#define vbu_atxmega16a4 36 +#define vbu_atxmega16a4u 36 +#define vbu_atxmega16c4 6 +#define vbu_atxmega16d4 6 +#define vbu_atxmega16e5 43 +#define vbu_atxmega32c3 6 +#define vbu_atxmega32d3 6 +#define vbu_atxmega32a4 36 +#define vbu_atxmega32a4u 36 +#define vbu_atxmega32c4 6 +#define vbu_atxmega32d4 6 +#define vbu_atxmega32e5 43 +#define vbu_atxmega64a1 102 +#define vbu_atxmega64a1u 102 +#define vbu_atxmega64b1 8 +#define vbu_atxmega64a3 75 +#define vbu_atxmega64a3u 75 +#define vbu_atxmega64b3 8 +#define vbu_atxmega64c3 6 +#define vbu_atxmega64d3 6 +#define vbu_atxmega64a4u 36 +#define vbu_atxmega64d4 6 +#define vbu_atxmega128a1 102 +#define vbu_atxmega128a1u 102 +#define vbu_atxmega128b1 8 +#define vbu_atxmega128a3 75 +#define vbu_atxmega128a3u 75 +#define vbu_atxmega128b3 8 +#define vbu_atxmega128c3 6 +#define vbu_atxmega128d3 6 +#define vbu_atxmega128a4u 36 +#define vbu_atxmega128d4 6 +#define vbu_atxmega192a3 75 +#define vbu_atxmega192a3u 75 +#define vbu_atxmega192c3 6 +#define vbu_atxmega192d3 6 +#define vbu_atxmega256a3 75 +#define vbu_atxmega256a3b 57 +#define vbu_atxmega256a3bu 57 +#define vbu_atxmega256a3u 75 +#define vbu_atxmega256c3 6 +#define vbu_atxmega256d3 6 +#define vbu_atxmega384c3 8 +#define vbu_atxmega384d3 6 +#define vbu_attiny202 4 +#define vbu_attiny204 5 +#define vbu_attiny212 4 +#define vbu_attiny214 5 +#define vbu_attiny402 4 +#define vbu_attiny404 5 +#define vbu_attiny406 14 +#define vbu_attiny412 4 +#define vbu_attiny414 5 +#define vbu_attiny416 26 +#define vbu_attiny416auto 26 +#define vbu_attiny417 26 +#define vbu_attiny424 30 +#define vbu_attiny426 30 +#define vbu_attiny427 30 +#define vbu_attiny804 14 +#define vbu_attiny806 14 +#define vbu_attiny807 14 +#define vbu_attiny814 5 +#define vbu_attiny816 26 +#define vbu_attiny817 26 +#define vbu_attiny824 30 +#define vbu_attiny826 30 +#define vbu_attiny827 30 +#define vbu_attiny1604 14 +#define vbu_attiny1606 14 +#define vbu_attiny1607 14 +#define vbu_attiny1614 5 +#define vbu_attiny1616 31 +#define vbu_attiny1617 31 +#define vbu_attiny1624 30 +#define vbu_attiny1626 30 +#define vbu_attiny1627 30 +#define vbu_attiny3214 31 +#define vbu_attiny3216 31 +#define vbu_attiny3217 31 +#define vbu_attiny3224 30 +#define vbu_attiny3226 30 +#define vbu_attiny3227 30 +#define vbu_atmega808 36 +#define vbu_atmega809 40 +#define vbu_atmega1608 36 +#define vbu_atmega1609 40 +#define vbu_atmega3208 36 +#define vbu_atmega3209 40 +#define vbu_atmega4808 36 +#define vbu_atmega4809 40 +#define vbu_avr16dd14 36 +#define vbu_avr16dd20 36 +#define vbu_avr16dd28 36 +#define vbu_avr16dd32 36 +#define vbu_avr32dd14 36 +#define vbu_avr32dd20 36 +#define vbu_avr32da28 41 +#define vbu_avr32db28 42 +#define vbu_avr32dd28 36 +#define vbu_avr32da32 41 +#define vbu_avr32db32 44 +#define vbu_avr32dd32 36 +#define vbu_avr32da48 58 +#define vbu_avr32db48 59 +#define vbu_avr64dd14 36 +#define vbu_avr64dd20 36 +#define vbu_avr64da28 41 +#define vbu_avr64db28 42 +#define vbu_avr64dd28 36 +#define vbu_avr64ea28 37 +#define vbu_avr64da32 41 +#define vbu_avr64db32 44 +#define vbu_avr64dd32 36 +#define vbu_avr64ea32 37 +#define vbu_avr64da48 58 +#define vbu_avr64db48 59 +#define vbu_avr64ea48 45 +#define vbu_avr64da64 64 +#define vbu_avr64db64 65 +#define vbu_avr128da28 41 +#define vbu_avr128db28 42 +#define vbu_avr128da32 41 +#define vbu_avr128db32 44 +#define vbu_avr128da48 58 +#define vbu_avr128db48 59 +#define vbu_avr128da64 64 +#define vbu_avr128db64 65 + +// Aliases for parts with the same vector table +#define vtab_attiny4 vtab_attiny9 +#define vtab_attiny5 vtab_attiny10 +#define vtab_attiny102 vtab_attiny104 +#define vtab_attiny13 vtab_attiny13a +#define vtab_attiny24 vtab_attiny84a +#define vtab_attiny24a vtab_attiny84a +#define vtab_attiny25 vtab_attiny85 +#define vtab_attiny44 vtab_attiny84a +#define vtab_attiny44a vtab_attiny84a +#define vtab_attiny45 vtab_attiny85 +#define vtab_attiny48 vtab_attiny88 +#define vtab_attiny84 vtab_attiny84a +#define vtab_attiny87 vtab_attiny167 +#define vtab_attiny261 vtab_attiny861a +#define vtab_attiny261a vtab_attiny861a +#define vtab_attiny441 vtab_attiny841 +#define vtab_attiny461 vtab_attiny861a +#define vtab_attiny461a vtab_attiny861a +#define vtab_attiny861 vtab_attiny861a +#define vtab_attiny2313a vtab_attiny4313 +#define vtab_atmega8 vtab_atmega8a +#define vtab_atmega8hva vtab_atmega16hva +#define vtab_atmega8u2 vtab_atmega32u2 +#define vtab_atmega16 vtab_atmega16a +#define vtab_atmega16hvb vtab_atmega32hvbrevb +#define vtab_atmega16hvbrevb vtab_atmega32hvbrevb +#define vtab_atmega16m1 vtab_atmega64m1 +#define vtab_atmega16u2 vtab_atmega32u2 +#define vtab_atmega16u4 vtab_atmega32u4 +#define vtab_atmega32 vtab_atmega323 +#define vtab_atmega32a vtab_atmega323 +#define vtab_atmega32hvb vtab_atmega32hvbrevb +#define vtab_atmega32c1 vtab_atmega64m1 +#define vtab_atmega32m1 vtab_atmega64m1 +#define vtab_atmega48 vtab_atmega328p +#define vtab_atmega48a vtab_atmega328p +#define vtab_atmega48p vtab_atmega328p +#define vtab_atmega48pa vtab_atmega328p +#define vtab_atmega48pb vtab_atmega168pb +#define vtab_atmega64 vtab_atmega128a +#define vtab_atmega64a vtab_atmega128a +#define vtab_atmega64hve vtab_atmega64hve2 +#define vtab_atmega64c1 vtab_atmega64m1 +#define vtab_atmega64rfr2 vtab_atmega2564rfr2 +#define vtab_atmega88 vtab_atmega328p +#define vtab_atmega88a vtab_atmega328p +#define vtab_atmega88p vtab_atmega328p +#define vtab_atmega88pa vtab_atmega328p +#define vtab_atmega88pb vtab_atmega168pb +#define vtab_atmega128 vtab_atmega128a +#define vtab_atmega128rfr2 vtab_atmega2564rfr2 +#define vtab_atmega164a vtab_atmega644pa +#define vtab_atmega164p vtab_atmega644pa +#define vtab_atmega164pa vtab_atmega644pa +#define vtab_atmega165 vtab_atmega645p +#define vtab_atmega165a vtab_atmega645p +#define vtab_atmega165p vtab_atmega645p +#define vtab_atmega165pa vtab_atmega645p +#define vtab_atmega168 vtab_atmega328 +#define vtab_atmega168a vtab_atmega328p +#define vtab_atmega168p vtab_atmega328p +#define vtab_atmega168pa vtab_atmega328p +#define vtab_atmega169 vtab_atmega649p +#define vtab_atmega169a vtab_atmega649p +#define vtab_atmega169p vtab_atmega649p +#define vtab_atmega169pa vtab_atmega649p +#define vtab_atmega256rfr2 vtab_atmega2564rfr2 +#define vtab_atmega324a vtab_atmega644pa +#define vtab_atmega324p vtab_atmega644pa +#define vtab_atmega324pa vtab_atmega644pa +#define vtab_atmega325 vtab_atmega645p +#define vtab_atmega325a vtab_atmega645p +#define vtab_atmega325p vtab_atmega645p +#define vtab_atmega325pa vtab_atmega645p +#define vtab_atmega329 vtab_atmega649p +#define vtab_atmega329a vtab_atmega649p +#define vtab_atmega329p vtab_atmega649p +#define vtab_atmega329pa vtab_atmega649p +#define vtab_atmega640 vtab_atmega2561 +#define vtab_atmega644a vtab_atmega644pa +#define vtab_atmega644p vtab_atmega644pa +#define vtab_atmega644rfr2 vtab_atmega2564rfr2 +#define vtab_atmega645 vtab_atmega645p +#define vtab_atmega645a vtab_atmega645p +#define vtab_atmega649 vtab_atmega649p +#define vtab_atmega649a vtab_atmega649p +#define vtab_atmega1280 vtab_atmega2561 +#define vtab_atmega1281 vtab_atmega2561 +#define vtab_atmega1284 vtab_atmega1284p +#define vtab_atmega1284rfr2 vtab_atmega2564rfr2 +#define vtab_atmega2560 vtab_atmega2561 +#define vtab_atmega3250 vtab_atmega6450p +#define vtab_atmega3250a vtab_atmega6450p +#define vtab_atmega3250p vtab_atmega6450p +#define vtab_atmega3250pa vtab_atmega6450p +#define vtab_atmega3290 vtab_atmega6490p +#define vtab_atmega3290a vtab_atmega6490p +#define vtab_atmega3290p vtab_atmega6490p +#define vtab_atmega3290pa vtab_atmega6490p +#define vtab_atmega6450 vtab_atmega6450p +#define vtab_atmega6450a vtab_atmega6450p +#define vtab_atmega6490 vtab_atmega6490p +#define vtab_atmega6490a vtab_atmega6490p +#define vtab_at90pwm1 vtab_at90pwm316 +#define vtab_at90pwm2b vtab_at90pwm3b +#define vtab_at90pwm3 vtab_at90pwm3b +#define vtab_at90can32 vtab_at90can128 +#define vtab_at90can64 vtab_at90can128 +#define vtab_at90pwm81 vtab_at90pwm161 +#define vtab_at90usb82 vtab_atmega32u2 +#define vtab_at90usb162 vtab_atmega32u2 +#define vtab_at90pwm216 vtab_at90pwm316 +#define vtab_at90usb646 vtab_atmega32u6 +#define vtab_at90usb647 vtab_atmega32u6 +#define vtab_at90usb1286 vtab_atmega32u6 +#define vtab_at90usb1287 vtab_atmega32u6 +#define vtab_at90s2323 vtab_attiny22 +#define vtab_at90s2333 vtab_at90s4433 +#define vtab_at90s2343 vtab_attiny22 +#define vtab_at90s4414 vtab_at90s8515 +#define vtab_at90s4434 vtab_at90s8535 +#define vtab_ata5505 vtab_attiny167 +#define vtab_ata5700m322 vtab_ata5702m322 +#define vtab_ata5781 vtab_ata8515 +#define vtab_ata5782 vtab_ata8515 +#define vtab_ata5783 vtab_ata8515 +#define vtab_ata5787 vtab_ata5835 +#define vtab_ata5790n vtab_ata5791 +#define vtab_ata5831 vtab_ata8515 +#define vtab_ata5832 vtab_ata8515 +#define vtab_ata5833 vtab_ata8515 +#define vtab_ata6285 vtab_ata6289 +#define vtab_ata6286 vtab_ata6289 +#define vtab_ata6612c vtab_atmega328p +#define vtab_ata6613c vtab_atmega328p +#define vtab_ata6614q vtab_atmega328p +#define vtab_ata6616c vtab_attiny167 +#define vtab_ata6617c vtab_attiny167 +#define vtab_ata8210 vtab_ata8515 +#define vtab_ata8215 vtab_ata8515 +#define vtab_ata8510 vtab_ata8515 +#define vtab_ata664251 vtab_attiny167 +#define vtab_atxmega8e5 vtab_atxmega32e5 +#define vtab_atxmega16a4 vtab_atxmega32a4 +#define vtab_atxmega16a4u vtab_atxmega128a4u +#define vtab_atxmega16c4 vtab_atxmega32c4 +#define vtab_atxmega16d4 vtab_atxmega32d4 +#define vtab_atxmega16e5 vtab_atxmega32e5 +#define vtab_atxmega32c3 vtab_atxmega256c3 +#define vtab_atxmega32d3 vtab_atxmega384d3 +#define vtab_atxmega32a4u vtab_atxmega128a4u +#define vtab_atxmega64a1 vtab_atxmega128a1 +#define vtab_atxmega64a1u vtab_atxmega128a1u +#define vtab_atxmega64b1 vtab_atxmega128b1 +#define vtab_atxmega64a3 vtab_atxmega256a3 +#define vtab_atxmega64a3u vtab_atxmega256a3u +#define vtab_atxmega64b3 vtab_atxmega128b3 +#define vtab_atxmega64c3 vtab_atxmega256c3 +#define vtab_atxmega64d3 vtab_atxmega384d3 +#define vtab_atxmega64a4u vtab_atxmega128a4u +#define vtab_atxmega64d4 vtab_atxmega128d4 +#define vtab_atxmega128a3 vtab_atxmega256a3 +#define vtab_atxmega128a3u vtab_atxmega256a3u +#define vtab_atxmega128c3 vtab_atxmega256c3 +#define vtab_atxmega128d3 vtab_atxmega384d3 +#define vtab_atxmega192a3 vtab_atxmega256a3 +#define vtab_atxmega192a3u vtab_atxmega256a3u +#define vtab_atxmega192c3 vtab_atxmega256c3 +#define vtab_atxmega192d3 vtab_atxmega384d3 +#define vtab_atxmega256d3 vtab_atxmega384d3 +#define vtab_attiny202 vtab_attiny402 +#define vtab_attiny204 vtab_attiny404 +#define vtab_attiny212 vtab_attiny412 +#define vtab_attiny214 vtab_attiny814 +#define vtab_attiny414 vtab_attiny814 +#define vtab_attiny416 vtab_attiny817 +#define vtab_attiny416auto vtab_attiny817 +#define vtab_attiny417 vtab_attiny817 +#define vtab_attiny424 vtab_attiny3227 +#define vtab_attiny426 vtab_attiny3227 +#define vtab_attiny427 vtab_attiny3227 +#define vtab_attiny804 vtab_attiny1607 +#define vtab_attiny806 vtab_attiny1607 +#define vtab_attiny807 vtab_attiny1607 +#define vtab_attiny816 vtab_attiny817 +#define vtab_attiny824 vtab_attiny3227 +#define vtab_attiny826 vtab_attiny3227 +#define vtab_attiny827 vtab_attiny3227 +#define vtab_attiny1604 vtab_attiny1607 +#define vtab_attiny1606 vtab_attiny1607 +#define vtab_attiny1616 vtab_attiny3217 +#define vtab_attiny1617 vtab_attiny3217 +#define vtab_attiny1624 vtab_attiny3227 +#define vtab_attiny1626 vtab_attiny3227 +#define vtab_attiny1627 vtab_attiny3227 +#define vtab_attiny3216 vtab_attiny3217 +#define vtab_attiny3224 vtab_attiny3227 +#define vtab_attiny3226 vtab_attiny3227 +#define vtab_atmega808 vtab_atmega4808 +#define vtab_atmega809 vtab_atmega4809 +#define vtab_atmega1608 vtab_atmega4808 +#define vtab_atmega1609 vtab_atmega4809 +#define vtab_atmega3208 vtab_atmega4808 +#define vtab_atmega3209 vtab_atmega4809 +#define vtab_avr16dd14 vtab_avr64dd32 +#define vtab_avr16dd20 vtab_avr64dd32 +#define vtab_avr16dd28 vtab_avr64dd32 +#define vtab_avr16dd32 vtab_avr64dd32 +#define vtab_avr32dd14 vtab_avr64dd32 +#define vtab_avr32dd20 vtab_avr64dd32 +#define vtab_avr32da28 vtab_avr128da28 +#define vtab_avr32db28 vtab_avr128db28 +#define vtab_avr32dd28 vtab_avr64dd32 +#define vtab_avr32da32 vtab_avr128da32 +#define vtab_avr32db32 vtab_avr128db32 +#define vtab_avr32dd32 vtab_avr64dd32 +#define vtab_avr32da48 vtab_avr128da48 +#define vtab_avr32db48 vtab_avr128db48 +#define vtab_avr64dd14 vtab_avr64dd32 +#define vtab_avr64dd20 vtab_avr64dd32 +#define vtab_avr64da28 vtab_avr128da28 +#define vtab_avr64db28 vtab_avr128db28 +#define vtab_avr64dd28 vtab_avr64dd32 +#define vtab_avr64ea28 vtab_avr64ea32 +#define vtab_avr64da32 vtab_avr128da32 +#define vtab_avr64db32 vtab_avr128db32 +#define vtab_avr64da48 vtab_avr128da48 +#define vtab_avr64db48 vtab_avr128db48 +#define vtab_avr64da64 vtab_avr128da64 +#define vtab_avr64db64 vtab_avr128db64 + +// Interrupt vector table interrupt names +extern const char * const vtab_attiny9[10]; // ATtiny9, ATtiny4 +extern const char * const vtab_attiny10[11]; // ATtiny10, ATtiny5 +extern const char * const vtab_attiny20[17]; // ATtiny20 +extern const char * const vtab_attiny40[18]; // ATtiny40 +extern const char * const vtab_attiny104[16]; // ATtiny104, ATtiny102 +extern const char * const vtab_attiny11[5]; // ATtiny11 +extern const char * const vtab_attiny12[6]; // ATtiny12 +extern const char * const vtab_attiny13a[10]; // ATtiny13A, ATtiny13 +extern const char * const vtab_attiny15[9]; // ATtiny15 +extern const char * const vtab_attiny22[3]; // ATtiny22, AT90S2343, AT90S2323 +extern const char * const vtab_attiny26[12]; // ATtiny26 +extern const char * const vtab_attiny28[6]; // ATtiny28 +extern const char * const vtab_attiny43u[16]; // ATtiny43U +extern const char * const vtab_attiny84a[17]; // ATtiny84A, ATtiny84, ATtiny44A, ATtiny44, ATtiny24A, ATtiny24 +extern const char * const vtab_attiny85[15]; // ATtiny85, ATtiny45, ATtiny25 +extern const char * const vtab_attiny88[20]; // ATtiny88, ATtiny48 +extern const char * const vtab_attiny167[20]; // ATtiny167, ATtiny87, ATA664251, ATA6617C, ATA6616C, ATA5505 +extern const char * const vtab_attiny828[26]; // ATtiny828 +extern const char * const vtab_attiny841[30]; // ATtiny841, ATtiny441 +extern const char * const vtab_attiny861a[19]; // ATtiny861A, ATtiny861, ATtiny461A, ATtiny461, ATtiny261A, ATtiny261 +extern const char * const vtab_attiny1634[28]; // ATtiny1634 +extern const char * const vtab_attiny2313[19]; // ATtiny2313 +extern const char * const vtab_attiny4313[21]; // ATtiny4313, ATtiny2313A +extern const char * const vtab_atmega8a[19]; // ATmega8A, ATmega8 +extern const char * const vtab_atmega16a[21]; // ATmega16A, ATmega16 +extern const char * const vtab_atmega16hva[21]; // ATmega16HVA, ATmega8HVA +extern const char * const vtab_atmega16hva2[22]; // ATmega16HVA2 +extern const char * const vtab_atmega32hvbrevb[29]; // ATmega32HVBrevB, ATmega32HVB, ATmega16HVBrevB, ATmega16HVB +extern const char * const vtab_atmega32u2[29]; // ATmega32U2, ATmega16U2, ATmega8U2, AT90USB162, AT90USB82 +extern const char * const vtab_atmega32u4[43]; // ATmega32U4, ATmega16U4 +extern const char * const vtab_atmega32u6[38]; // ATmega32U6, AT90USB1287, AT90USB1286, AT90USB647, AT90USB646 +extern const char * const vtab_atmega64m1[31]; // ATmega64M1, ATmega64C1, ATmega32M1, ATmega32C1, ATmega16M1 +extern const char * const vtab_atmega64hve2[25]; // ATmega64HVE2, ATmega64HVE +extern const char * const vtab_atmega103[24]; // ATmega103 +extern const char * const vtab_atmega128a[35]; // ATmega128A, ATmega128, ATmega64A, ATmega64 +extern const char * const vtab_atmega128rfa1[72]; // ATmega128RFA1 +extern const char * const vtab_atmega161[21]; // ATmega161 +extern const char * const vtab_atmega162[28]; // ATmega162 +extern const char * const vtab_atmega163[18]; // ATmega163 +extern const char * const vtab_atmega168pb[27]; // ATmega168PB, ATmega88PB, ATmega48PB +extern const char * const vtab_atmega323[21]; // ATmega323, ATmega32A, ATmega32 +extern const char * const vtab_atmega324pb[51]; // ATmega324PB +extern const char * const vtab_atmega328[26]; // ATmega328, ATmega168 +extern const char * const vtab_atmega328p[26]; // ATmega328P, ATmega168PA, ATmega168P, ATmega168A, ATmega88PA, ATmega88P, ATmega88A, ATmega88, ATmega48PA, ATmega48P, ATmega48A, ATmega48, ATA6614Q, ATA6613C, ATA6612C +extern const char * const vtab_atmega328pb[45]; // ATmega328PB +extern const char * const vtab_atmega406[23]; // ATmega406 +extern const char * const vtab_atmega644[28]; // ATmega644 +extern const char * const vtab_atmega644pa[31]; // ATmega644PA, ATmega644P, ATmega644A, ATmega324PA, ATmega324P, ATmega324A, ATmega164PA, ATmega164P, ATmega164A +extern const char * const vtab_atmega645p[22]; // ATmega645P, ATmega645A, ATmega645, ATmega325PA, ATmega325P, ATmega325A, ATmega325, ATmega165PA, ATmega165P, ATmega165A, ATmega165 +extern const char * const vtab_atmega649p[23]; // ATmega649P, ATmega649A, ATmega649, ATmega329PA, ATmega329P, ATmega329A, ATmega329, ATmega169PA, ATmega169P, ATmega169A, ATmega169 +extern const char * const vtab_atmega1284p[35]; // ATmega1284P, ATmega1284 +extern const char * const vtab_atmega2561[57]; // ATmega2561, ATmega2560, ATmega1281, ATmega1280, ATmega640 +extern const char * const vtab_atmega2564rfr2[77]; // ATmega2564RFR2, ATmega1284RFR2, ATmega644RFR2, ATmega256RFR2, ATmega128RFR2, ATmega64RFR2 +extern const char * const vtab_atmega6450p[25]; // ATmega6450P, ATmega6450A, ATmega6450, ATmega3250PA, ATmega3250P, ATmega3250A, ATmega3250 +extern const char * const vtab_atmega6490p[25]; // ATmega6490P, ATmega6490A, ATmega6490, ATmega3290PA, ATmega3290P, ATmega3290A, ATmega3290 +extern const char * const vtab_atmega8515[17]; // ATmega8515 +extern const char * const vtab_atmega8535[21]; // ATmega8535 +extern const char * const vtab_at86rf401[3]; // AT86RF401 +extern const char * const vtab_at90pwm2[32]; // AT90PWM2 +extern const char * const vtab_at90pwm3b[32]; // AT90PWM3B, AT90PWM3, AT90PWM2B +extern const char * const vtab_at90scr100[38]; // AT90SCR100 +extern const char * const vtab_at90can128[37]; // AT90CAN128, AT90CAN64, AT90CAN32 +extern const char * const vtab_at90pwm161[20]; // AT90PWM161, AT90PWM81 +extern const char * const vtab_at90pwm316[32]; // AT90PWM316, AT90PWM216, AT90PWM1 +extern const char * const vtab_at90s1200[4]; // AT90S1200 +extern const char * const vtab_at90s2313[11]; // AT90S2313 +extern const char * const vtab_at90s4433[14]; // AT90S4433, AT90S2333 +extern const char * const vtab_at90s8515[13]; // AT90S8515, AT90S4414 +extern const char * const vtab_at90s8535[17]; // AT90S8535, AT90S4434 +extern const char * const vtab_ata5272[37]; // ATA5272 +extern const char * const vtab_ata5702m322[51]; // ATA5702M322, ATA5700M322 +extern const char * const vtab_ata5790[30]; // ATA5790 +extern const char * const vtab_ata5791[31]; // ATA5791, ATA5790N +extern const char * const vtab_ata5795[23]; // ATA5795 +extern const char * const vtab_ata5835[44]; // ATA5835, ATA5787 +extern const char * const vtab_ata6289[27]; // ATA6289, ATA6286, ATA6285 +extern const char * const vtab_ata8515[42]; // ATA8515, ATA8510, ATA8215, ATA8210, ATA5833, ATA5832, ATA5831, ATA5783, ATA5782, ATA5781 +extern const char * const vtab_atxmega32a4[94]; // ATxmega32A4, ATxmega16A4 +extern const char * const vtab_atxmega32c4[127]; // ATxmega32C4, ATxmega16C4 +extern const char * const vtab_atxmega32d4[91]; // ATxmega32D4, ATxmega16D4 +extern const char * const vtab_atxmega32e5[43]; // ATxmega32E5, ATxmega16E5, ATxmega8E5 +extern const char * const vtab_atxmega128a1[125]; // ATxmega128A1, ATxmega64A1 +extern const char * const vtab_atxmega128a1u[127]; // ATxmega128A1U, ATxmega64A1U +extern const char * const vtab_atxmega128b1[81]; // ATxmega128B1, ATxmega64B1 +extern const char * const vtab_atxmega128b3[54]; // ATxmega128B3, ATxmega64B3 +extern const char * const vtab_atxmega128a4u[127]; // ATxmega128A4U, ATxmega64A4U, ATxmega32A4U, ATxmega16A4U +extern const char * const vtab_atxmega128d4[91]; // ATxmega128D4, ATxmega64D4 +extern const char * const vtab_atxmega256a3[122]; // ATxmega256A3, ATxmega192A3, ATxmega128A3, ATxmega64A3 +extern const char * const vtab_atxmega256a3b[122]; // ATxmega256A3B +extern const char * const vtab_atxmega256a3bu[127]; // ATxmega256A3BU +extern const char * const vtab_atxmega256a3u[127]; // ATxmega256A3U, ATxmega192A3U, ATxmega128A3U, ATxmega64A3U +extern const char * const vtab_atxmega256c3[127]; // ATxmega256C3, ATxmega192C3, ATxmega128C3, ATxmega64C3, ATxmega32C3 +extern const char * const vtab_atxmega384c3[127]; // ATxmega384C3 +extern const char * const vtab_atxmega384d3[114]; // ATxmega384D3, ATxmega256D3, ATxmega192D3, ATxmega128D3, ATxmega64D3, ATxmega32D3 +extern const char * const vtab_attiny402[26]; // ATtiny402, ATtiny202 +extern const char * const vtab_attiny404[26]; // ATtiny404, ATtiny204 +extern const char * const vtab_attiny406[26]; // ATtiny406 +extern const char * const vtab_attiny412[26]; // ATtiny412, ATtiny212 +extern const char * const vtab_attiny814[26]; // ATtiny814, ATtiny414, ATtiny214 +extern const char * const vtab_attiny817[26]; // ATtiny817, ATtiny816, ATtiny417, ATtiny416auto, ATtiny416 +extern const char * const vtab_attiny1607[31]; // ATtiny1607, ATtiny1606, ATtiny1604, ATtiny807, ATtiny806, ATtiny804 +extern const char * const vtab_attiny1614[31]; // ATtiny1614 +extern const char * const vtab_attiny3214[31]; // ATtiny3214 +extern const char * const vtab_attiny3217[31]; // ATtiny3217, ATtiny3216, ATtiny1617, ATtiny1616 +extern const char * const vtab_attiny3227[30]; // ATtiny3227, ATtiny3226, ATtiny3224, ATtiny1627, ATtiny1626, ATtiny1624, ATtiny827, ATtiny826, ATtiny824, ATtiny427, ATtiny426, ATtiny424 +extern const char * const vtab_atmega4808[36]; // ATmega4808, ATmega3208, ATmega1608, ATmega808 +extern const char * const vtab_atmega4809[40]; // ATmega4809, ATmega3209, ATmega1609, ATmega809 +extern const char * const vtab_avr64dd32[36]; // AVR64DD32, AVR64DD28, AVR64DD20, AVR64DD14, AVR32DD32, AVR32DD28, AVR32DD20, AVR32DD14, AVR16DD32, AVR16DD28, AVR16DD20, AVR16DD14 +extern const char * const vtab_avr64ea32[37]; // AVR64EA32, AVR64EA28 +extern const char * const vtab_avr64ea48[45]; // AVR64EA48 +extern const char * const vtab_avr128da28[41]; // AVR128DA28, AVR64DA28, AVR32DA28 +extern const char * const vtab_avr128db28[42]; // AVR128DB28, AVR64DB28, AVR32DB28 +extern const char * const vtab_avr128da32[44]; // AVR128DA32, AVR64DA32, AVR32DA32 +extern const char * const vtab_avr128db32[44]; // AVR128DB32, AVR64DB32, AVR32DB32 +extern const char * const vtab_avr128da48[58]; // AVR128DA48, AVR64DA48, AVR32DA48 +extern const char * const vtab_avr128db48[61]; // AVR128DB48, AVR64DB48, AVR32DB48 +extern const char * const vtab_avr128da64[64]; // AVR128DA64, AVR64DA64 +extern const char * const vtab_avr128db64[65]; // AVR128DB64, AVR64DB64 + +const uPcore_t uP_table[372]; + +#endif diff --git a/src/avrpart.c b/src/avrpart.c index fb04a157..1e4fefee 100644 --- a/src/avrpart.c +++ b/src/avrpart.c @@ -583,6 +583,7 @@ AVRPART *avr_new_part(void) { p->mem_alias = lcreat(NULL, 0); // Default values + p->mcuid = -1; p->hvupdi_variant = -1; memset(p->signature, 0xFF, 3); p->reset_disposition = RESET_DEDICATED; diff --git a/src/config.c b/src/config.c index 531dac83..ebef8f4b 100644 --- a/src/config.c +++ b/src/config.c @@ -31,6 +31,7 @@ #include "avrdude.h" #include "libavrdude.h" #include "config.h" +#include "avrintel.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)); } } + +// 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); +} diff --git a/src/config.h b/src/config.h index e92400b6..8bacda42 100644 --- a/src/config.h +++ b/src/config.h @@ -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_update_mcuid(AVRPART *part); #ifdef __cplusplus } diff --git a/src/config_gram.y b/src/config_gram.y index f8a20629..5c5a687d 100644 --- a/src/config_gram.y +++ b/src/config_gram.y @@ -374,6 +374,8 @@ part_def : YYABORT; } + cfg_update_mcuid(current_part); + // Sanity checks for memory sizes and compute/override num_pages entry for (ln=lfirst(current_part->mem); ln; ln=lnext(ln)) { m = ldata(ln); diff --git a/src/doc/avrdude.texi b/src/doc/avrdude.texi index 19d019c5..8b955d44 100644 --- a/src/doc/avrdude.texi +++ b/src/doc/avrdude.texi @@ -1766,7 +1766,7 @@ part id = ; # quoted string family_id = ; # quoted string, eg, "megaAVR" or "tinyAVR" prog_modes = PM_ @{ | PM_ @} # interfaces, eg, PM_SPM|PM_ISP|PM_HVPP|PM_debugWIRE - mcuid = ; # unique id in 0..2039 for urclock programmer + mcuid = ; # unique id in 0..2039 for 8-bit AVRs n_interrupts = ; # number of interrupts, used for vector bootloaders n_page_erase = ; # if set, number of pages erased during NVM erase hvupdi_variant = ; # numeric -1 (n/a) or 0..2 From 4f7868ef4bf66e9c59851ca20a219425c0480845 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Tue, 30 Aug 2022 19:54:41 +0100 Subject: [PATCH 06/11] Declare rather than define extern const uPcore_t uP_table[372]; --- src/avrintel.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/avrintel.h b/src/avrintel.h index d8bc07ec..b4f40a44 100644 --- a/src/avrintel.h +++ b/src/avrintel.h @@ -1472,6 +1472,6 @@ extern const char * const vtab_avr128db48[61]; // AVR128DB48, AVR64DB48, AVR3 extern const char * const vtab_avr128da64[64]; // AVR128DA64, AVR64DA64 extern const char * const vtab_avr128db64[65]; // AVR128DB64, AVR64DB64 -const uPcore_t uP_table[372]; +extern const uPcore_t uP_table[372]; #endif From ffb8b7fcdf98df1d21ecac10c8f6b39019dbee4e Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Tue, 30 Aug 2022 21:31:11 +0100 Subject: [PATCH 07/11] Try different header files for Windows compatibility --- src/avrintel.c | 11 +++++++++++ src/avrintel.h | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/avrintel.c b/src/avrintel.c index c31b01eb..edf7d114 100644 --- a/src/avrintel.c +++ b/src/avrintel.c @@ -13,6 +13,17 @@ * */ +#include "ac_cfg.h" + +#include +#include +#include +#include +#include +#include +#include +#include + #include "avrintel.h" const uPcore_t uP_table[] = { // Value of -1 typically means unknown diff --git a/src/avrintel.h b/src/avrintel.h index b4f40a44..69f4862c 100644 --- a/src/avrintel.h +++ b/src/avrintel.h @@ -16,7 +16,7 @@ #ifndef AVRINTEL_H #define AVRINTEL_H -#include "config.h" +#include "libavrdude.h" typedef struct { // Value of -1 typically means unknown const char *name; // Name of part From b328067f874b782774cf00e4029d84f6fe0711c9 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Tue, 30 Aug 2022 23:25:00 +0100 Subject: [PATCH 08/11] Remove has_jtag, has_debugwire, etc assignments in avrdude.conf.in These assignments have been removed as they are redundant and only imitate the single prog_modes = PM_... | PM_....; assignment. They are still allowed in the grammar, and would still work. --- src/avrdude.conf.in | 67 --------------------------------------------- 1 file changed, 67 deletions(-) diff --git a/src/avrdude.conf.in b/src/avrdude.conf.in index 197663ef..df64dfea 100644 --- a/src/avrdude.conf.in +++ b/src/avrdude.conf.in @@ -2323,7 +2323,6 @@ programmer hvupdi_support = 1; ; - # # PART DEFINITIONS # @@ -2502,7 +2501,6 @@ part stk500_devcode = 0x14; chip_erase_delay = 4000; signature = 0x1e 0x90 0x07; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -3551,7 +3549,6 @@ part bs2 = 0xa0; signature = 0x1e 0x96 0x02; reset = io; - has_jtag = yes; allowfullpagebitstream = yes; timeout = 200; stabdelay = 100; @@ -3681,7 +3678,6 @@ part bs2 = 0xa0; signature = 0x1e 0x97 0x02; reset = io; - has_jtag = yes; allowfullpagebitstream = yes; timeout = 200; stabdelay = 100; @@ -3812,7 +3808,6 @@ part # avr910_devcode = 0x43; signature = 0x1e 0x97 0x81; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -3936,7 +3931,6 @@ part # avr910_devcode = 0x43; signature = 0x1e 0x96 0x81; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -4060,7 +4054,6 @@ part # avr910_devcode = 0x43; signature = 0x1e 0x95 0x81; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -4184,7 +4177,6 @@ part bs2 = 0xa0; signature = 0x1e 0x94 0x03; reset = io; - has_jtag = yes; allowfullpagebitstream = yes; timeout = 200; stabdelay = 100; @@ -4310,7 +4302,6 @@ part bs2 = 0xa0; signature = 0x1e 0x95 0x08; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -4508,7 +4499,6 @@ part bs2 = 0xa0; signature = 0x1e 0x96 0x09; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -4664,7 +4654,6 @@ part bs2 = 0xa0; signature = 0x1e 0x97 0x06; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -4800,7 +4789,6 @@ part bs2 = 0xa0; signature = 0x1e 0x94 0x04; reset = io; - has_jtag = yes; allowfullpagebitstream = yes; timeout = 200; stabdelay = 100; @@ -5023,7 +5011,6 @@ part avr910_devcode = 0x78; chip_erase_delay = 9000; signature = 0x1e 0x94 0x05; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -5181,7 +5168,6 @@ part chip_erase_delay = 9000; signature = 0x1e 0x95 0x03; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -5385,7 +5371,6 @@ part chip_erase_delay = 9000; signature = 0x1e 0x96 0x03; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -5567,7 +5552,6 @@ part bs2 = 0xa0; signature = 0x1e 0x95 0x02; reset = io; - has_jtag = yes; allowfullpagebitstream = yes; timeout = 200; stabdelay = 100; @@ -6218,7 +6202,6 @@ part # stk500_devcode = 0x21; # avr910_devcode = 0x5e; signature = 0x1e 0x91 0x0c; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -6355,7 +6338,6 @@ part # stk500_devcode = 0x21; # avr910_devcode = 0x5e; signature = 0x1e 0x92 0x08; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -6492,7 +6474,6 @@ part # stk500_devcode = 0x21; # avr910_devcode = 0x5e; signature = 0x1e 0x93 0x0d; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -6682,7 +6663,6 @@ part # avr910_devcode = 0x??; signature = 0x1e 0x92 0x05; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -6855,7 +6835,6 @@ part # avr910_devcode = 0x??; signature = 0x1e 0x93 0x0a; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -7029,7 +7008,6 @@ part # avr910_devcode = 0x??; signature = 0x1e 0x94 0x06; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -7203,7 +7181,6 @@ part # avr910_devcode = 0x??; signature = 0x1e 0x93 0x14; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -7341,7 +7318,6 @@ part chip_erase_delay = 15000; signature = 0x1e 0x93 0x87; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -7469,7 +7445,6 @@ part chip_erase_delay = 15000; signature = 0x1e 0x94 0x87; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -7596,7 +7571,6 @@ part # avr910_devcode = 0x??; signature = 0x1e 0x92 0x09; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -7725,7 +7699,6 @@ part # avr910_devcode = 0x??; signature = 0x1e 0x93 0x11; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -7854,7 +7827,6 @@ part # avr910_devcode = 0x??; signature = 0x1e 0x95 0x14; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -8069,7 +8041,6 @@ part bs2 = 0xd6; signature = 0x1e 0x91 0x0a; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -8214,7 +8185,6 @@ part bs2 = 0xd6; signature = 0x1e 0x92 0x0d; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -8342,7 +8312,6 @@ part # avr910_devcode = ?; signature = 0x1e 0x93 0x81; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -8543,7 +8512,6 @@ part chip_erase_delay = 4500; signature = 0x1e 0x91 0x08; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -8673,7 +8641,6 @@ part chip_erase_delay = 4500; signature = 0x1e 0x92 0x06; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -8804,7 +8771,6 @@ part chip_erase_delay = 4500; signature = 0x1e 0x93 0x0b; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -8935,7 +8901,6 @@ part bs2 = 0xa0; signature = 0x1e 0x96 0x08; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -9059,7 +9024,6 @@ part bs2 = 0xa0; signature = 0x1e 0x97 0x03; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -9196,7 +9160,6 @@ part bs2 = 0xa0; signature = 0x1e 0x98 0x01; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -9456,7 +9419,6 @@ part chip_erase_delay = 4500; signature = 0x1e 0x91 0x0b; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -9597,7 +9559,6 @@ part chip_erase_delay = 4500; signature = 0x1e 0x92 0x07; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -9738,7 +9699,6 @@ part chip_erase_delay = 4500; signature = 0x1e 0x93 0x0c; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -9930,7 +9890,6 @@ part chip_erase_delay = 1000; signature = 0x1e 0x92 0x0c; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -10061,7 +10020,6 @@ part signature = 0x1e 0x94 0x88; usbpid = 0x2ff4; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -10186,7 +10144,6 @@ part signature = 0x1e 0x95 0x87; usbpid = 0x2ff4; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -10311,7 +10268,6 @@ part signature = 0x1e 0x96 0x82; usbpid = 0x2ff9; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -10447,7 +10403,6 @@ part signature = 0x1e 0x97 0x82; usbpid = 0x2ffb; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -10581,7 +10536,6 @@ part signature = 0x1e 0x94 0x82; usbpid = 0x2ffa; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -10702,7 +10656,6 @@ part signature = 0x1e 0x93 0x82; usbpid = 0x2ff7; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -10823,7 +10776,6 @@ part signature = 0x1e 0x95 0x8a; usbpid = 0x2ff0; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -10944,7 +10896,6 @@ part signature = 0x1e 0x94 0x89; usbpid = 0x2fef; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -11065,7 +11016,6 @@ part signature = 0x1e 0x93 0x89; usbpid = 0x2fee; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -11187,7 +11137,6 @@ part bs2 = 0xa0; signature = 0x1e 0x94 0x10; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -11343,7 +11292,6 @@ part bs2 = 0xa0; signature = 0x1e 0x95 0x05; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -11502,7 +11450,6 @@ part bs2 = 0xa0; signature = 0x1e 0x96 0x05; reset = io; - has_jtag = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -11723,7 +11670,6 @@ part desc = "AVR XMEGA family common values"; id = ".xmega"; prog_modes = PM_SPM | PM_PDI; - has_pdi = yes; mcu_base = 0x0090; nvm_base = 0x01c0; @@ -12060,7 +12006,6 @@ part parent "x64a4u" mcuid = 243; n_interrupts = 125; signature = 0x1e 0x96 0x4e; - has_jtag = yes; memory "fuse0" size = 1; @@ -12235,7 +12180,6 @@ part parent "x128c3" mcuid = 254; n_interrupts = 125; signature = 0x1e 0x97 0x4c; - has_jtag = yes; memory "fuse0" size = 1; @@ -12301,7 +12245,6 @@ part parent ".xmega" prog_modes = PM_SPM | PM_PDI | PM_JTAG; mcuid = 263; signature = 0x1e 0x97 0x46; - has_jtag = yes; memory "eeprom" size = 2048; @@ -12418,7 +12361,6 @@ part parent ".xmega" n_interrupts = 81; signature = 0x1e 0x97 0x4d; usbpid = 0x2fea; - has_jtag = yes; memory "eeprom" size = 2048; @@ -12558,7 +12500,6 @@ part parent "x192c3" prog_modes = PM_SPM | PM_PDI | PM_JTAG; mcuid = 266; signature = 0x1e 0x97 0x4e; - has_jtag = yes; memory "fuse0" size = 1; @@ -12666,7 +12607,6 @@ part parent "x256c3" id = "x256a1"; prog_modes = PM_SPM | PM_PDI | PM_JTAG; mcuid = 271; - has_jtag = yes; memory "fuse0" size = 1; @@ -12960,8 +12900,6 @@ part id = "uc3a0512"; prog_modes = PM_JTAG | PM_aWire; signature = 0xed 0xc0 0x3f; - has_jtag = yes; - is_avr32 = yes; memory "flash" paged = yes; @@ -13000,7 +12938,6 @@ part # avr910_devcode = 0x??; signature = 0x1e 0x94 0x12; reset = io; - has_debugwire = yes; timeout = 200; stabdelay = 100; cmdexedelay = 25; @@ -13128,7 +13065,6 @@ part desc = "Common values for reduced core tinys"; id = ".reduced_core_tiny"; prog_modes = PM_TPI; - has_tpi = yes; memory "fuse" size = 1; @@ -13313,7 +13249,6 @@ part bs2 = 0xa0; signature = 0x1e 0x95 0x07; reset = io; - has_jtag = yes; serial = no; # STK500v2 HV programming parameters, from XML pp_controlstack = @@ -13371,7 +13306,6 @@ part desc = "AVR8X family common values"; id = ".avr8x"; prog_modes = PM_SPM | PM_UPDI; - has_updi = yes; nvm_base = 0x1000; ocd_base = 0x0f80; @@ -14745,7 +14679,6 @@ part prog_modes = PM_SPM | PM_UPDI; # Dedicated UPDI pin, no HV hvupdi_variant = 1; - has_updi = yes; nvm_base = 0x1000; ocd_base = 0x0f80; From 40896802af9f20658a362ac0a0af962a582ad40f Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Wed, 31 Aug 2022 11:29:06 +0100 Subject: [PATCH 09/11] Allow integer expressions in config file where numbers are expected Notable exceptions are for pin numbers and where numbers are separated by space only, eg, in signature and readback assignments. --- src/avrdude.conf.in | 148 +++++++++++++++++++++---------------------- src/config_gram.y | 132 +++++++++++++++++++------------------- src/doc/avrdude.texi | 125 ++++++++++++++++++++---------------- src/lexer.l | 2 +- 4 files changed, 213 insertions(+), 194 deletions(-) diff --git a/src/avrdude.conf.in b/src/avrdude.conf.in index df64dfea..1152af77 100644 --- a/src/avrdude.conf.in +++ b/src/avrdude.conf.in @@ -17,51 +17,49 @@ # Possible entry formats are: # # programmer -# parent # optional parent -# id = [, [, ] ...] ; # are quoted strings -# desc = ; # quoted string -# type = ; # programmer type, quoted string -# # supported types can be listed by "-c ?type" -# prog_modes = PM_ {| PM_} # interfaces, eg, PM_SPM|PM_PDI (1) +# parent # optional parent +# id = [, ... ] ; # are quoted strings +# desc = ; # quoted string +# type = ; # programmer type, quoted string +# # supported types can be listed by "-c ?type" +# prog_modes = PM_ {| PM_} # interfaces, eg, PM_SPM|PM_PDI (1) # connection_type = parallel | serial | usb | spi -# baudrate = ; # baudrate for avr910-programmer -# vcc = [, ... ] ; # pin number(s) -# buff = [, ... ] ; # pin number(s) -# reset = ; # pin number -# sck = ; # pin number -# mosi = ; # pin number -# miso = ; # pin number -# errled = ; # pin number -# rdyled = ; # pin number -# pgmled = ; # pin number -# vfyled = ; # pin number -# usbvid = ; # USB VID (Vendor ID) -# usbpid = [, ...] ; # USB PID (Product ID) (2) -# usbdev = ; # USB interface or other device info -# usbvendor = ; # USB Vendor Name -# usbproduct = ; # USB Product Name -# usbsn = ; # USB Serial Number -# hvupdi_support = [, , ... ] ; # UPDI HV Variants Support +# baudrate = ; # baudrate for avr910-programmer +# vcc = [, ... ] ; # pin number(s) +# buff = [, ... ] ; # pin number(s) +# reset = ; # pin number +# sck = ; # pin number +# mosi = ; # pin number +# miso = ; # pin number +# errled = ; # pin number +# rdyled = ; # pin number +# pgmled = ; # pin number +# vfyled = ; # pin number +# usbvid = ; # USB VID (Vendor ID) +# usbpid = [, ...] ; # USB PID (Product ID) (2) +# usbdev = ; # USB interface or other device info +# usbvendor = ; # USB Vendor Name +# usbproduct = ; # USB Product Name +# usbsn = ; # USB Serial Number +# hvupdi_support = [, , ... ] ; # UPDI HV Variants Support # ; # -# # To invert a bit, use = ~ , the spaces are important. -# # For a pin list all pins must be inverted. -# # A single pin can be specified as usual = ~ , for lists -# # specify it as follows = ~ ( [, ... ] ). -# # -# # (1) The following program modes are known: -# # - PM_SPM: Bootloaders, self-programming with SPM opcodes or NVM Controllers -# # - PM_TPI: Tiny Programming Interface (t4, t5, t9, t10, t20, t40, t102, t104) -# # - PM_ISP: SPI programming for In-System Programming (almost all classic parts) -# # - PM_PDI: Program and Debug Interface (xmega parts) -# # - PM_UPDI: Unified Program and Debug Interface -# # - PM_HVSP: High Voltage Serial Programming (some classic parts) -# # - PM_HVPP: High Voltage Parallel Programming (most non-HVSP classic parts) -# # - PM_debugWIRE: Simpler alternative to JTAG (a subset of HVPP/HVSP parts) -# # - PM_JTAG: Joint Test Action Group standard (some classic parts, some xmega) -# # - PM_aWire: AVR32 parts -# # -# # (2) Not all programmer types can process a list of PIDs +# # To invert a pin use = ~ +# # To invert a pin list (all pins get inverted) use ~ ( [, ... ] ) +# # +# # (1) The following program modes are known: +# # - PM_SPM: Bootloaders, self-programming with SPM opcodes or NVM Controllers +# # - PM_TPI: Tiny Programming Interface (t4, t5, t9, t10, t20, t40, t102, t104) +# # - PM_ISP: SPI programming for In-System Programming (almost all classic parts) +# # - PM_PDI: Program and Debug Interface (xmega parts) +# # - PM_UPDI: Unified Program and Debug Interface +# # - PM_HVSP: High Voltage Serial Programming (some classic parts) +# # - PM_HVPP: High Voltage Parallel Programming (most non-HVSP classic parts) +# # - PM_debugWIRE: Simpler alternative to JTAG (a subset of HVPP/HVSP parts) +# # - PM_JTAG: Joint Test Action Group standard (some classic parts, some xmega) +# # - PM_aWire: AVR32 parts +# # +# # (2) Not all programmer types can process a list of PIDs # # part # desc = ; # quoted string @@ -75,13 +73,12 @@ # devicecode = ; # deprecated, use stk500_devcode # stk500_devcode = ; # numeric # avr910_devcode = ; # numeric -# has_jtag = ; # part has JTAG i/f -# has_debugwire = ; # part has debugWire i/f -# has_pdi = ; # part has PDI i/f -# has_updi = ; # part has UPDI i/f -# has_tpi = ; # part has TPI i/f -# is_avr32 = ; # AVR32 part -# +# has_jtag = ; # part has JTAG i/f (deprecated, use prog_modes) +# has_debugwire = ; # part has debugWire i/f (deprecated, use prog_modes) +# has_pdi = ; # part has PDI i/f (deprecated, use prog_modes) +# has_updi = ; # part has UPDI i/f (deprecated, use prog_modes) +# has_tpi = ; # part has TPI i/f (deprecated, use prog_modes) +# is_avr32 = ; # AVR32 part (deprecated, use prog_modes) # is_at90s1200 = ; # AT90S1200 part # signature = ; # signature bytes # usbpid = ; # DFU USB PID @@ -94,7 +91,7 @@ # bs2 = ; # pin name in hex, i.e., 0xA0 # serial = ; # can use serial downloading # parallel = ; # can use par. programming -# # STK500v2 parameters, to be taken from Atmel's XML files +# # STK500v2 parameters, to be taken from Atmel's ATDF files # timeout = ; # stabdelay = ; # cmdexedelay = ; @@ -106,13 +103,13 @@ # postdelay = ; # pollmethod = ; # hvspcmdexedelay = ; -# # STK500v2 HV programming parameters, from XML -# pp_controlstack = , , ... ; # PP only -# hvsp_controlstack = , , ... ; # HVSP only +# # STK500v2 HV programming parameters, from ATDFs +# pp_controlstack = , , ... ; # PP only +# hvsp_controlstack = , , ... ; # HVSP only # flash_instr = , , ; # eeprom_instr = , , ... ; # hventerstabdelay = ; -# progmodedelay = ; # PP only +# progmodedelay = ; # PP only # latchcycles = ; # togglevtg = ; # poweroffdelay = ; @@ -120,21 +117,21 @@ # resetdelayus = ; # hvleavestabdelay = ; # resetdelay = ; -# synchcycles = ; # HVSP only -# chiperasepulsewidth = ; # PP only +# synchcycles = ; # HVSP only +# chiperasepulsewidth = ; # PP only # chiperasepolltimeout = ; -# chiperasetime = ; # HVSP only -# programfusepulsewidth = ; # PP only +# chiperasetime = ; # HVSP only +# programfusepulsewidth = ; # PP only # programfusepolltimeout = ; -# programlockpulsewidth = ; # PP only +# programlockpulsewidth = ; # PP only # programlockpolltimeout = ; -# # JTAG ICE mkII parameters, also from XML files +# # JTAG ICE mkII parameters, also from ATDF files # allowfullpagebitstream = ; # enablepageprogramming = ; -# idr = ; # IO addr of IDR (OCD) reg -# rampz = ; # IO addr of RAMPZ reg -# spmcr = ; # mem addr of SPMC[S]R reg -# eecr = ; # mem addr of EECR reg only when != 0x3f +# idr = ; # IO addr of IDR (OCD) reg +# rampz = ; # IO addr of RAMPZ reg +# spmcr = ; # mem addr of SPMC[S]R reg +# eecr = ; # mem addr of EECR reg only when != 0x3f # mcu_base = ; # nvm_base = ; # ocd_base = ; @@ -154,7 +151,7 @@ # readback_p1 = ; # byte value (first component) # readback_p2 = ; # byte value (second component) # pwroff_after_write = ; # yes/no -# mode = ; # STK500 v2 file parameter, to be taken from Atmel's XML files +# mode = ; # STK500 v2 file parameter from ATDF files # delay = ; # " # blocksize = ; # " # readsize = ; # " @@ -171,10 +168,13 @@ # ; # # If any of the above parameters are not specified, the default value -# of 0 is used for numerics (except for hvupdi_variant and ocdrev, -# where the default value is -1) or the empty string ("") for string -# values. If a required parameter is left empty, AVRDUDE will -# complain. +# of 0 is used for numerics (except for mcuid, hvupdi_variant and +# ocdrev, where the default value is -1) or the empty string "" for +# string values. If a required parameter is left empty, AVRDUDE will +# complain. Almost all occurrences of numbers (with the exception of +# pin numbers and where they are separated by space, eg, in signature +# and readback) can also be given as simple expressions involving +# arithemtic and bitwise operators. # # Parts can also inherit parameters from previously defined parts # using the following syntax. In this case specified integer and @@ -185,7 +185,7 @@ # memory definition is extended, and components overwritten with new # values. Assigning NULL removes an inherited SPI instruction format, # memory definition, control stack, eeprom or flash instruction, eg, -# as in memory "efuse" = NULL; +# as in memory "efuse" = NULL; # # part parent # quoted string # id = ; # quoted string @@ -195,16 +195,16 @@ # NOTES: # * 'devicecode' is the device code used by the STK500 (see codes # listed below) -# * Not all memory types will implement all instructions. -# * AVR Fuse bits and Lock bits are implemented as a type of memory. +# * Not all memory types will implement all instructions +# * AVR Fuse bits and Lock bits are implemented as a type of memory # * Example memory types are: # "flash", "eeprom", "fuse", "lfuse" (low fuse), "hfuse" (high # fuse), "signature", "calibration", "lock" # * The memory type specified on the avrdude command line must match -# one of the memory types defined for the specified chip. +# one of the memory types defined for the specified chip # * The pwroff_after_write flag causes avrdude to attempt to # power the device off and back on after an unsuccessful write to -# the affected memory area if VCC programmer pins are defined. If +# the affected memory area if VCC programmer pins are defined. If # VCC pins are not defined for the programmer, a message # indicating that the device needs a power-cycle is printed out. # This flag was added to work around a problem with the diff --git a/src/config_gram.y b/src/config_gram.y index 5c5a687d..ca47dab5 100644 --- a/src/config_gram.y +++ b/src/config_gram.y @@ -227,7 +227,7 @@ static int pin_name; %% number_real : - TKN_NUMBER { + numexpr { $$ = $1; /* convert value to real */ $$->value.number_real = $$->value.number; @@ -461,8 +461,8 @@ string_list : num_list : - TKN_NUMBER { ladd(number_list, $1); } | - num_list TKN_COMMA TKN_NUMBER { ladd(number_list, $3); } + numexpr { ladd(number_list, $1); } | + num_list TKN_COMMA numexpr { ladd(number_list, $3); } ; prog_parms : @@ -496,7 +496,7 @@ prog_parm : current_prog->desc = cache_string($3->value.string); free_token($3); } | - K_BAUDRATE TKN_EQUAL TKN_NUMBER { + K_BAUDRATE TKN_EQUAL numexpr { { current_prog->baudrate = $3->value.number; free_token($3); @@ -545,7 +545,7 @@ prog_parm_usb: free_token($3); } } | - K_USBVID TKN_EQUAL TKN_NUMBER { + K_USBVID TKN_EQUAL numexpr { { current_prog->usbvid = $3->value.number; free_token($3); @@ -573,7 +573,7 @@ prog_parm_usb: ; usb_pid_list: - TKN_NUMBER { + numexpr { { /* overwrite pids, so clear the existing entries */ if(current_prog->usbpid) @@ -587,7 +587,7 @@ usb_pid_list: free_token($1); } } | - usb_pid_list TKN_COMMA TKN_NUMBER { + usb_pid_list TKN_COMMA numexpr { { int *ip = cfg_malloc("usb_pid_list", sizeof(int)); *ip = $3->value.number; @@ -602,7 +602,7 @@ prog_parm_updi: ; hvupdi_support_list: - TKN_NUMBER { + numexpr { { /* overwrite list entries, so clear the existing entries */ if(current_prog->hvupdi_support) @@ -616,7 +616,7 @@ hvupdi_support_list: free_token($1); } } | - hvupdi_support_list TKN_COMMA TKN_NUMBER { + hvupdi_support_list TKN_COMMA numexpr { { int *ip = cfg_malloc("hvupdi_support_list", sizeof(int)); *ip = $3->value.number; @@ -727,13 +727,13 @@ part_parm : free_token($3); } | - K_HVUPDI_VARIANT TKN_EQUAL TKN_NUMBER + K_HVUPDI_VARIANT TKN_EQUAL numexpr { current_part->hvupdi_variant = $3->value.number; free_token($3); } | - K_DEVICECODE TKN_EQUAL TKN_NUMBER { + K_DEVICECODE TKN_EQUAL numexpr { { yyerror("devicecode is deprecated, use " "stk500_devcode instead"); @@ -741,14 +741,14 @@ part_parm : } } | - K_STK500_DEVCODE TKN_EQUAL TKN_NUMBER { + K_STK500_DEVCODE TKN_EQUAL numexpr { { current_part->stk500_devcode = $3->value.number; free_token($3); } } | - K_AVR910_DEVCODE TKN_EQUAL TKN_NUMBER { + K_AVR910_DEVCODE TKN_EQUAL numexpr { { current_part->avr910_devcode = $3->value.number; free_token($3); @@ -766,7 +766,7 @@ part_parm : } } | - K_USBPID TKN_EQUAL TKN_NUMBER { + K_USBPID TKN_EQUAL numexpr { { current_part->usbpid = $3->value.number; free_token($3); @@ -921,19 +921,19 @@ part_parm : } } | - K_CHIP_ERASE_DELAY TKN_EQUAL TKN_NUMBER + K_CHIP_ERASE_DELAY TKN_EQUAL numexpr { current_part->chip_erase_delay = $3->value.number; free_token($3); } | - K_PAGEL TKN_EQUAL TKN_NUMBER + K_PAGEL TKN_EQUAL numexpr { current_part->pagel = $3->value.number; free_token($3); } | - K_BS2 TKN_EQUAL TKN_NUMBER + K_BS2 TKN_EQUAL numexpr { current_part->bs2 = $3->value.number; free_token($3); @@ -949,169 +949,169 @@ part_parm : free_tokens(2, $1, $3); } | - K_TIMEOUT TKN_EQUAL TKN_NUMBER + K_TIMEOUT TKN_EQUAL numexpr { current_part->timeout = $3->value.number; free_token($3); } | - K_STABDELAY TKN_EQUAL TKN_NUMBER + K_STABDELAY TKN_EQUAL numexpr { current_part->stabdelay = $3->value.number; free_token($3); } | - K_CMDEXEDELAY TKN_EQUAL TKN_NUMBER + K_CMDEXEDELAY TKN_EQUAL numexpr { current_part->cmdexedelay = $3->value.number; free_token($3); } | - K_HVSPCMDEXEDELAY TKN_EQUAL TKN_NUMBER + K_HVSPCMDEXEDELAY TKN_EQUAL numexpr { current_part->hvspcmdexedelay = $3->value.number; free_token($3); } | - K_SYNCHLOOPS TKN_EQUAL TKN_NUMBER + K_SYNCHLOOPS TKN_EQUAL numexpr { current_part->synchloops = $3->value.number; free_token($3); } | - K_BYTEDELAY TKN_EQUAL TKN_NUMBER + K_BYTEDELAY TKN_EQUAL numexpr { current_part->bytedelay = $3->value.number; free_token($3); } | - K_POLLVALUE TKN_EQUAL TKN_NUMBER + K_POLLVALUE TKN_EQUAL numexpr { current_part->pollvalue = $3->value.number; free_token($3); } | - K_POLLINDEX TKN_EQUAL TKN_NUMBER + K_POLLINDEX TKN_EQUAL numexpr { current_part->pollindex = $3->value.number; free_token($3); } | - K_PREDELAY TKN_EQUAL TKN_NUMBER + K_PREDELAY TKN_EQUAL numexpr { current_part->predelay = $3->value.number; free_token($3); } | - K_POSTDELAY TKN_EQUAL TKN_NUMBER + K_POSTDELAY TKN_EQUAL numexpr { current_part->postdelay = $3->value.number; free_token($3); } | - K_POLLMETHOD TKN_EQUAL TKN_NUMBER + K_POLLMETHOD TKN_EQUAL numexpr { current_part->pollmethod = $3->value.number; free_token($3); } | - K_HVENTERSTABDELAY TKN_EQUAL TKN_NUMBER + K_HVENTERSTABDELAY TKN_EQUAL numexpr { current_part->hventerstabdelay = $3->value.number; free_token($3); } | - K_PROGMODEDELAY TKN_EQUAL TKN_NUMBER + K_PROGMODEDELAY TKN_EQUAL numexpr { current_part->progmodedelay = $3->value.number; free_token($3); } | - K_LATCHCYCLES TKN_EQUAL TKN_NUMBER + K_LATCHCYCLES TKN_EQUAL numexpr { current_part->latchcycles = $3->value.number; free_token($3); } | - K_TOGGLEVTG TKN_EQUAL TKN_NUMBER + K_TOGGLEVTG TKN_EQUAL numexpr { current_part->togglevtg = $3->value.number; free_token($3); } | - K_POWEROFFDELAY TKN_EQUAL TKN_NUMBER + K_POWEROFFDELAY TKN_EQUAL numexpr { current_part->poweroffdelay = $3->value.number; free_token($3); } | - K_RESETDELAYMS TKN_EQUAL TKN_NUMBER + K_RESETDELAYMS TKN_EQUAL numexpr { current_part->resetdelayms = $3->value.number; free_token($3); } | - K_RESETDELAYUS TKN_EQUAL TKN_NUMBER + K_RESETDELAYUS TKN_EQUAL numexpr { current_part->resetdelayus = $3->value.number; free_token($3); } | - K_HVLEAVESTABDELAY TKN_EQUAL TKN_NUMBER + K_HVLEAVESTABDELAY TKN_EQUAL numexpr { current_part->hvleavestabdelay = $3->value.number; free_token($3); } | - K_RESETDELAY TKN_EQUAL TKN_NUMBER + K_RESETDELAY TKN_EQUAL numexpr { current_part->resetdelay = $3->value.number; free_token($3); } | - K_CHIPERASEPULSEWIDTH TKN_EQUAL TKN_NUMBER + K_CHIPERASEPULSEWIDTH TKN_EQUAL numexpr { current_part->chiperasepulsewidth = $3->value.number; free_token($3); } | - K_CHIPERASEPOLLTIMEOUT TKN_EQUAL TKN_NUMBER + K_CHIPERASEPOLLTIMEOUT TKN_EQUAL numexpr { current_part->chiperasepolltimeout = $3->value.number; free_token($3); } | - K_CHIPERASETIME TKN_EQUAL TKN_NUMBER + K_CHIPERASETIME TKN_EQUAL numexpr { current_part->chiperasetime = $3->value.number; free_token($3); } | - K_PROGRAMFUSEPULSEWIDTH TKN_EQUAL TKN_NUMBER + K_PROGRAMFUSEPULSEWIDTH TKN_EQUAL numexpr { current_part->programfusepulsewidth = $3->value.number; free_token($3); } | - K_PROGRAMFUSEPOLLTIMEOUT TKN_EQUAL TKN_NUMBER + K_PROGRAMFUSEPOLLTIMEOUT TKN_EQUAL numexpr { current_part->programfusepolltimeout = $3->value.number; free_token($3); } | - K_PROGRAMLOCKPULSEWIDTH TKN_EQUAL TKN_NUMBER + K_PROGRAMLOCKPULSEWIDTH TKN_EQUAL numexpr { current_part->programlockpulsewidth = $3->value.number; free_token($3); } | - K_PROGRAMLOCKPOLLTIMEOUT TKN_EQUAL TKN_NUMBER + K_PROGRAMLOCKPOLLTIMEOUT TKN_EQUAL numexpr { current_part->programlockpolltimeout = $3->value.number; free_token($3); } | - K_SYNCHCYCLES TKN_EQUAL TKN_NUMBER + K_SYNCHCYCLES TKN_EQUAL numexpr { current_part->synchcycles = $3->value.number; free_token($3); @@ -1201,49 +1201,49 @@ part_parm : free_token($3); } | - K_IDR TKN_EQUAL TKN_NUMBER + K_IDR TKN_EQUAL numexpr { current_part->idr = $3->value.number; free_token($3); } | - K_RAMPZ TKN_EQUAL TKN_NUMBER + K_RAMPZ TKN_EQUAL numexpr { current_part->rampz = $3->value.number; free_token($3); } | - K_SPMCR TKN_EQUAL TKN_NUMBER + K_SPMCR TKN_EQUAL numexpr { current_part->spmcr = $3->value.number; free_token($3); } | - K_EECR TKN_EQUAL TKN_NUMBER + K_EECR TKN_EQUAL numexpr { current_part->eecr = $3->value.number; free_token($3); } | - K_MCU_BASE TKN_EQUAL TKN_NUMBER + K_MCU_BASE TKN_EQUAL numexpr { current_part->mcu_base = $3->value.number; free_token($3); } | - K_NVM_BASE TKN_EQUAL TKN_NUMBER + K_NVM_BASE TKN_EQUAL numexpr { current_part->nvm_base = $3->value.number; free_token($3); } | - K_OCD_BASE TKN_EQUAL TKN_NUMBER + K_OCD_BASE TKN_EQUAL numexpr { current_part->ocd_base = $3->value.number; free_token($3); } | - K_OCDREV TKN_EQUAL TKN_NUMBER + K_OCDREV TKN_EQUAL numexpr { current_part->ocdrev = $3->value.number; free_token($3); @@ -1399,14 +1399,14 @@ mem_spec : free_token($3); } | - K_SIZE TKN_EQUAL TKN_NUMBER + K_SIZE TKN_EQUAL numexpr { current_mem->size = $3->value.number; free_token($3); } | - K_PAGE_SIZE TKN_EQUAL TKN_NUMBER + K_PAGE_SIZE TKN_EQUAL numexpr { int ps = $3->value.number; if (ps <= 0) @@ -1418,25 +1418,25 @@ mem_spec : free_token($3); } | - K_NUM_PAGES TKN_EQUAL TKN_NUMBER + K_NUM_PAGES TKN_EQUAL numexpr { current_mem->num_pages = $3->value.number; free_token($3); } | - K_OFFSET TKN_EQUAL TKN_NUMBER + K_OFFSET TKN_EQUAL numexpr { current_mem->offset = $3->value.number; free_token($3); } | - K_MIN_WRITE_DELAY TKN_EQUAL TKN_NUMBER + K_MIN_WRITE_DELAY TKN_EQUAL numexpr { current_mem->min_write_delay = $3->value.number; free_token($3); } | - K_MAX_WRITE_DELAY TKN_EQUAL TKN_NUMBER + K_MAX_WRITE_DELAY TKN_EQUAL numexpr { current_mem->max_write_delay = $3->value.number; free_token($3); @@ -1456,44 +1456,44 @@ mem_spec : free_token($4); } | - K_READBACK_P1 TKN_EQUAL TKN_NUMBER + K_READBACK_P1 TKN_EQUAL numexpr { current_mem->readback[0] = $3->value.number; free_token($3); } | - K_READBACK_P2 TKN_EQUAL TKN_NUMBER + K_READBACK_P2 TKN_EQUAL numexpr { current_mem->readback[1] = $3->value.number; free_token($3); } | - K_MODE TKN_EQUAL TKN_NUMBER + K_MODE TKN_EQUAL numexpr { current_mem->mode = $3->value.number; free_token($3); } | - K_DELAY TKN_EQUAL TKN_NUMBER + K_DELAY TKN_EQUAL numexpr { current_mem->delay = $3->value.number; free_token($3); } | - K_BLOCKSIZE TKN_EQUAL TKN_NUMBER + K_BLOCKSIZE TKN_EQUAL numexpr { current_mem->blocksize = $3->value.number; free_token($3); } | - K_READSIZE TKN_EQUAL TKN_NUMBER + K_READSIZE TKN_EQUAL numexpr { current_mem->readsize = $3->value.number; free_token($3); } | - K_POLLINDEX TKN_EQUAL TKN_NUMBER + K_POLLINDEX TKN_EQUAL numexpr { current_mem->pollindex = $3->value.number; free_token($3); diff --git a/src/doc/avrdude.texi b/src/doc/avrdude.texi index 8b955d44..3bcade32 100644 --- a/src/doc/avrdude.texi +++ b/src/doc/avrdude.texi @@ -1694,31 +1694,31 @@ The format of the programmer definition is as follows: @smallexample programmer - parent # optional parent - id = [, [, ] ...] ; # are quoted strings - desc = ; # quoted string - type = ; # programmer type, quoted string - # supported types can be listed by "-c ?type" - prog_modes = PM_ @{ | PM_ @} # interfaces, eg, PM_SPM|PM_PDI + parent # optional parent + id = [, ... ] ; # are quoted strings + desc = ; # quoted string + type = ; # programmer type, quoted string + # supported types can be listed by "-c ?type" + prog_modes = PM_ @{ | PM_ @} # interfaces, eg, PM_SPM|PM_PDI connection_type = parallel | serial | usb | spi - baudrate = ; # baudrate for avr910-programmer - vcc = [, ... ] ; # pin number(s) - buff = [, ... ] ; # pin number(s) - reset = ; # pin number - sck = ; # pin number - mosi = ; # pin number - miso = ; # pin number - errled = ; # pin number - rdyled = ; # pin number - pgmled = ; # pin number - vfyled = ; # pin number - usbvid = ; # USB VID (Vendor ID) - usbpid = [, ...] ; # USB PID (Product ID) - usbdev = ; # USB interface or other device info - usbvendor = ; # USB Vendor Name - usbproduct = ; # USB Product Name - usbsn = ; # USB Serial Number - hvupdi_support = [, , ... ] ; # UPDI HV Variants Support + baudrate = ; # baudrate for avr910-programmer + vcc = [, ... ] ; # pin number(s) + buff = [, ... ] ; # pin number(s) + reset = ; # pin number + sck = ; # pin number + mosi = ; # pin number + miso = ; # pin number + errled = ; # pin number + rdyled = ; # pin number + pgmled = ; # pin number + vfyled = ; # pin number + usbvid = ; # USB VID (Vendor ID) + usbpid = [, ...] ; # USB PID (Product ID) + usbdev = ; # USB interface or other device info + usbvendor = ; # USB Vendor Name + usbproduct = ; # USB Product Name + usbsn = ; # USB Serial Number + hvupdi_support = [, , ... ] ; # UPDI HV Variants Support ; @end smallexample @@ -1742,7 +1742,8 @@ Known programming modes are @end itemize @noindent -To invert a bit in the pin definitions, use @code{= ~ }. +To invert a bit in the pin definitions, use @code{= ~ }. To invert a pin list +(all pins get inverted) use @code{~ ( [, ... ] )}. @noindent Not all programmer types can handle a list of USB PIDs. @@ -1765,7 +1766,7 @@ part desc = ; # quoted string id = ; # quoted string family_id = ; # quoted string, eg, "megaAVR" or "tinyAVR" - prog_modes = PM_ @{ | PM_ @} # interfaces, eg, PM_SPM|PM_ISP|PM_HVPP|PM_debugWIRE + prog_modes = PM_ @{| PM_@} # interfaces, eg, PM_SPM|PM_ISP|PM_HVPP|PM_debugWIRE mcuid = ; # unique id in 0..2039 for 8-bit AVRs n_interrupts = ; # number of interrupts, used for vector bootloaders n_page_erase = ; # if set, number of pages erased during NVM erase @@ -1773,12 +1774,12 @@ part devicecode = ; # deprecated, use stk500_devcode stk500_devcode = ; # numeric avr910_devcode = ; # numeric - has_jtag = ; # part has JTAG i/f - has_debugwire = ; # part has debugWire i/f - has_pdi = ; # part has PDI i/f - has_updi = ; # part has UPDI i/f - has_tpi = ; # part has TPI i/f - is_avr32 = ; # AVR32 part + has_jtag = ; # part has JTAG i/f (deprecated, use prog_modes) + has_debugwire = ; # part has debugWire i/f (deprecated, use prog_modes) + has_pdi = ; # part has PDI i/f (deprecated, use prog_modes) + has_updi = ; # part has UPDI i/f (deprecated, use prog_modes) + has_tpi = ; # part has TPI i/f (deprecated, use prog_modes) + is_avr32 = ; # AVR32 part (deprecated, use prog_modes) is_at90s1200 = ; # AT90S1200 part signature = ; # signature bytes usbpid = ; # DFU USB PID @@ -1791,7 +1792,7 @@ part bs2 = ; # pin name in hex, i.e., 0xA0 serial = ; # can use serial downloading parallel = ; # can use par. programming - # STK500v2 parameters, to be taken from Atmel's XML files + # STK500v2 parameters, to be taken from Atmel's ATDF files timeout = ; stabdelay = ; cmdexedelay = ; @@ -1803,13 +1804,13 @@ part postdelay = ; pollmethod = ; hvspcmdexedelay = ; - # STK500v2 HV programming parameters, from XML - pp_controlstack = , , ... ; # PP only - hvsp_controlstack = , , ... ; # HVSP only + # STK500v2 HV programming parameters, from ATDFs + pp_controlstack = , , ... ; # PP only + hvsp_controlstack = , , ... ; # HVSP only flash_instr = , , ; eeprom_instr = , , ... ; hventerstabdelay = ; - progmodedelay = ; # PP only + progmodedelay = ; # PP only latchcycles = ; togglevtg = ; poweroffdelay = ; @@ -1817,21 +1818,21 @@ part resetdelayus = ; hvleavestabdelay = ; resetdelay = ; - synchcycles = ; # HVSP only - chiperasepulsewidth = ; # PP only + synchcycles = ; # HVSP only + chiperasepulsewidth = ; # PP only chiperasepolltimeout = ; - chiperasetime = ; # HVSP only - programfusepulsewidth = ; # PP only + chiperasetime = ; # HVSP only + programfusepulsewidth = ; # PP only programfusepolltimeout = ; - programlockpulsewidth = ; # PP only + programlockpulsewidth = ; # PP only programlockpolltimeout = ; - # JTAG ICE mkII parameters, also from XML files + # JTAG ICE mkII parameters, also from ATDF files allowfullpagebitstream = ; enablepageprogramming = ; - idr = ; # IO addr of IDR (OCD) reg - rampz = ; # IO addr of RAMPZ reg - spmcr = ; # mem addr of SPMC[S]R reg - eecr = ; # mem addr of EECR reg only when != 0x3f + idr = ; # IO addr of IDR (OCD) reg + rampz = ; # IO addr of RAMPZ reg + spmcr = ; # mem addr of SPMC[S]R reg + eecr = ; # mem addr of EECR reg only when != 0x3f mcu_base = ; nvm_base = ; ocd_base = ; @@ -1851,7 +1852,7 @@ part readback_p1 = ; # byte value (first component) readback_p2 = ; # byte value (second component) pwroff_after_write = ; # yes/no - mode = ; # STK500 v2 file parameter from Atmel's XML files + mode = ; # STK500 v2 file parameter from ATDF files delay = ; # " blocksize = ; # " readsize = ; # " @@ -1868,6 +1869,16 @@ part ; @end smallexample +@noindent +If any of the above parameters are not specified, the default value +of 0 is used for numerics (except for @code{mcuid}, @code{hvupdi_variant} and @code{ocdrev}, +where the default value is -1) or the empty string @code{""} for string +values. If a required parameter is left empty, AVRDUDE will complain. +Almost all occurrences of numbers (with the exception of pin numbers +and where they are separated by space, eg, in signature and readback) +can also be given as simple expressions involving arithemtic and +bitwise operators. + @menu * Parent Part:: * Instruction Format:: @@ -1880,11 +1891,19 @@ part @subsection Parent Part @noindent -Parts can also inherit parameters from previously defined parts -using the following syntax. In this case specified integer and -string values override parameter values from the parent part. New -memory definitions are added to the definitions inherited from the -parent. +Parts can also inherit parameters from previously defined parts using +the following syntax. In this case specified integer and string values +override parameter values from the parent part. New memory definitions +are added to the definitions inherited from the parent. If, however, a +new memory definition refers to an existing one of the same name for +that part then, from v7.1, the existing memory definition is extended, +and components overwritten with new values. Assigning @code{NULL} +removes an inherited SPI instruction format, memory definition, control +stack, eeprom or flash instruction, eg, as in @code{memory "efuse" = +NULL;} + +@noindent +Example format for part inheritance: @smallexample part parent # quoted string diff --git a/src/lexer.l b/src/lexer.l index 65b7a451..02fa6008 100644 --- a/src/lexer.l +++ b/src/lexer.l @@ -63,7 +63,7 @@ SIGN [+-] %% -{SIGN}?{DIGIT}+ { yylval = new_number(yytext); return TKN_NUMBER; } +{DIGIT}+ { yylval = new_number(yytext); return TKN_NUMBER; /* sign is treated in grammar */ } {SIGN}?{DIGIT}+"."{DIGIT}* { yylval = new_number_real(yytext); return TKN_NUMBER_REAL; } {SIGN}?"."{DIGIT}+ { yylval = new_number_real(yytext); return TKN_NUMBER_REAL; } From fc970226b663e8d55de2c366db3051c5656fdd44 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Wed, 31 Aug 2022 11:31:58 +0100 Subject: [PATCH 10/11] Add avrintel.[ch] to Makefile.am --- src/Makefile.am | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Makefile.am b/src/Makefile.am index 9e0929e1..cc1e2ee1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -198,6 +198,8 @@ avrdude_SOURCES = \ main.c \ whereami.c \ whereami.h \ + avrintel.c \ + avrintel.h \ developer_opts.c \ developer_opts.h \ developer_opts_private.h \ From 602fab481c32f015d50de641ee88db1c0a16aad6 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Wed, 31 Aug 2022 11:59:19 +0100 Subject: [PATCH 11/11] Relax uniqueness check of mcuid for parts that might be variants Two parts are considered variants here if one part name starts with the name of the other, flash memory sizes are the same, flash page sizes are the same and the number of interrupts are the same. --- src/config.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index ebef8f4b..a0351833 100644 --- a/src/config.c +++ b/src/config.c @@ -861,11 +861,20 @@ void cfg_update_mcuid(AVRPART *part) { } } - // None have the same name: an entry with part->mcuid is an error + // None have the same name: an entry with part->mcuid might be 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); + // Complain unless it can be considered a variant, eg, ATmega32L and ATmega32 + AVRMEM *flash = avr_locate_mem(part, "flash"); + if(flash) { + size_t l1 = strlen(part->desc), l2 = strlen(uP_table[i].name); + if(strncasecmp(part->desc, uP_table[i].name, l1 < l2? l1: l2) || + flash->size != uP_table[i].flashsize || + flash->page_size != uP_table[i].pagesize || + part->n_interrupts != uP_table[i].ninterrupts) + 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; }