Merge branch 'avrdudes:main' into partdesc

This commit is contained in:
Stefan Rueger 2022-07-18 16:02:01 +01:00 committed by GitHub
commit 068e78e832
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 941 additions and 375 deletions

6
NEWS
View File

@ -38,6 +38,12 @@ Changes since version 7.0:
- Fix ft245r paged read for ATmega2560 et al #1018 - Fix ft245r paged read for ATmega2560 et al #1018
- Add option -A that supresses trailing 0xff optimisation - Add option -A that supresses trailing 0xff optimisation
and automatically do so for -c arduino #936 and automatically do so for -c arduino #936
- Fix linuxspi default port #933
- Add support for high-voltage UPDI im jtag3.c #1015
- Fix terminal write edge cases;
add one read mode;
add quell command #1025
- Fix usbtiny read for parts with more than 64 kB flash #1029
* Internals: * Internals:

View File

@ -180,7 +180,7 @@ has a revision 1 hardware and firmware version of at least 5.37 (decimal).
For ATxmega devices, the JTAGICE3 is supported in PDI mode. For ATxmega devices, the JTAGICE3 is supported in PDI mode.
.Pp .Pp
Atmel-ICE (ARM/AVR) is supported in all modes (JTAG, PDI for Xmega, debugWIRE, Atmel-ICE (ARM/AVR) is supported in all modes (JTAG, PDI for Xmega, debugWIRE,
ISP). ISP, UPDI).
.Pp .Pp
Atmel's XplainedPro boards, using the EDBG protocol (CMSIS-DAP compatible), Atmel's XplainedPro boards, using the EDBG protocol (CMSIS-DAP compatible),
are supported using the "jtag3" programmer type. are supported using the "jtag3" programmer type.
@ -226,7 +226,7 @@ thus the name
SerialUPDI programmer implementation is based on Microchip's SerialUPDI programmer implementation is based on Microchip's
.Em pymcuprog Li https://github.com/microchip-pic-avr-tools/pymcuprog .Em pymcuprog Li https://github.com/microchip-pic-avr-tools/pymcuprog
utility, but it also contains some performance improvements included in utility, but it also contains some performance improvements included in
Spence Kohde's Spence Konde's
.Em DxCore .Em DxCore
Arduino core Arduino core
.Li https://github.com/SpenceKonde/DxCore . .Li https://github.com/SpenceKonde/DxCore .
@ -978,9 +978,13 @@ versions of the bootloader.
.It Ar JTAG ICE mkII .It Ar JTAG ICE mkII
.It Ar JTAGICE3 .It Ar JTAGICE3
.It Ar Atmel-ICE .It Ar Atmel-ICE
.It Ar Power Debugger
.It Ar PICkit 4
.It Ar MPLAB SNAP
.It Ar AVR Dragon .It Ar AVR Dragon
When using the JTAG ICE mkII, JTAGICE3, Atmel-ICE or AVR Dragon in JTAG mode, the When using the JTAG ICE mkII, JTAGICE3, Atmel-ICE, PICkit 4, MPLAB SNAP,
following extended parameter is accepted: Power Debugger or AVR Dragon in JTAG mode, the following extended parameter
is accepted:
.Bl -tag -offset indent -width indent .Bl -tag -offset indent -width indent
.It Ar jtagchain=UB,UA,BB,BA .It Ar jtagchain=UB,UA,BB,BA
Setup the JTAG scan chain for Setup the JTAG scan chain for
@ -995,6 +999,14 @@ bits after the target AVR, respectively.
Each AVR unit within the chain shifts by 4 bits. Each AVR unit within the chain shifts by 4 bits.
Other JTAG units might require a different bit shift count. Other JTAG units might require a different bit shift count.
.El .El
.Pp
The PICkit 4 and the Power Debugger also supports high-voltage UPDI programming.
This is used to enable a UPDI pin that has previously been set to RESET or
GPIO mode. High-voltage UPDI can be utilized by using an extended parameter:
.Bl -tag -offset indent -width indent
.It Ar hvupdi
Enable high-voltage UPDI initialization for targets that supports this.
.El
.It Ar AVR910 .It Ar AVR910
.Bl -tag -offset indent -width indent .Bl -tag -offset indent -width indent
.It Ar devcode=VALUE .It Ar devcode=VALUE

View File

@ -22,7 +22,7 @@
# desc = <description> ; # quoted string # desc = <description> ; # quoted string
# type = <type>; # programmer type, quoted string # type = <type>; # programmer type, quoted string
# # supported programmer types can be listed by "-c ?type" # # supported programmer types can be listed by "-c ?type"
# connection_type = parallel | serial | usb # connection_type = parallel | serial | usb | spi
# baudrate = <num> ; # baudrate for avr910-programmer # baudrate = <num> ; # baudrate for avr910-programmer
# vcc = <num1> [, <num2> ... ] ; # pin number(s) # vcc = <num1> [, <num2> ... ] ; # pin number(s)
# buff = <num1> [, <num2> ... ] ; # pin number(s) # buff = <num1> [, <num2> ... ] ; # pin number(s)
@ -40,6 +40,7 @@
# usbvendor = <vendorname>; # USB Vendor Name # usbvendor = <vendorname>; # USB Vendor Name
# usbproduct = <productname>; # USB Product Name # usbproduct = <productname>; # USB Product Name
# usbsn = <serialno>; # USB Serial Number # usbsn = <serialno>; # USB Serial Number
# hvupdi_support = <num> [, <num>, ... ] ; # UPDI HV Variants Support
# #
# To invert a bit, use = ~ <num>, the spaces are important. # To invert a bit, use = ~ <num>, the spaces are important.
# For a pin list all pins must be inverted. # For a pin list all pins must be inverted.
@ -337,6 +338,7 @@
# #
default_parallel = "@DEFAULT_PAR_PORT@"; default_parallel = "@DEFAULT_PAR_PORT@";
default_serial = "@DEFAULT_SER_PORT@"; default_serial = "@DEFAULT_SER_PORT@";
default_spi = "@DEFAULT_SPI_PORT@";
# default_bitclock = 2.5; # default_bitclock = 2.5;
# #
@ -630,6 +632,7 @@ programmer
desc = "SerialUPDI"; desc = "SerialUPDI";
type = "serialupdi"; type = "serialupdi";
connection_type = serial; connection_type = serial;
hvupdi_support = 1;
; ;
programmer programmer
@ -1177,6 +1180,7 @@ programmer
type = "jtagice3_updi"; type = "jtagice3_updi";
connection_type = usb; connection_type = usb;
usbpid = 0x2110, 0x2140; usbpid = 0x2110, 0x2140;
hvupdi_support = 1;
; ;
programmer programmer
@ -1209,6 +1213,7 @@ programmer
type = "jtagice3_updi"; type = "jtagice3_updi";
connection_type = usb; connection_type = usb;
usbpid = 0x2111; usbpid = 0x2111;
hvupdi_support = 1;
; ;
programmer programmer
@ -1233,6 +1238,7 @@ programmer
type = "jtagice3_updi"; type = "jtagice3_updi";
connection_type = usb; connection_type = usb;
usbpid = 0x2145; usbpid = 0x2145;
hvupdi_support = 1;
; ;
programmer programmer
@ -1257,6 +1263,7 @@ programmer
type = "jtagice3_updi"; type = "jtagice3_updi";
connection_type = usb; connection_type = usb;
usbpid = 0x2141; usbpid = 0x2141;
hvupdi_support = 1;
; ;
programmer programmer
@ -1297,6 +1304,7 @@ programmer
type = "jtagice3_updi"; type = "jtagice3_updi";
connection_type = usb; connection_type = usb;
usbpid = 0x2144; usbpid = 0x2144;
hvupdi_support = 0, 1;
; ;
programmer programmer
@ -1321,6 +1329,7 @@ programmer
type = "jtagice3_updi"; type = "jtagice3_updi";
connection_type = usb; connection_type = usb;
usbpid = 0x2177, 0x2178, 0x2179; usbpid = 0x2177, 0x2178, 0x2179;
hvupdi_support = 0, 1, 2;
; ;
programmer programmer
@ -1345,6 +1354,7 @@ programmer
type = "jtagice3_updi"; type = "jtagice3_updi";
connection_type = usb; connection_type = usb;
usbpid = 0x217F, 0x2180, 0x2181; usbpid = 0x217F, 0x2180, 0x2181;
hvupdi_support = 1;
; ;
programmer programmer
@ -1369,6 +1379,7 @@ programmer
type = "jtagice3_updi"; type = "jtagice3_updi";
connection_type = usb; connection_type = usb;
usbpid = 0x2175; usbpid = 0x2175;
hvupdi_support = 1;
; ;
programmer programmer
@ -1642,6 +1653,7 @@ programmer
id = "linuxspi"; id = "linuxspi";
desc = "Use Linux SPI device in /dev/spidev*"; desc = "Use Linux SPI device in /dev/spidev*";
type = "linuxspi"; type = "linuxspi";
connection_type = spi;
reset = 25; # Pi GPIO number - this is J8:22 reset = 25; # Pi GPIO number - this is J8:22
; ;
@HAVE_LINUXSPI_END@ @HAVE_LINUXSPI_END@
@ -1737,6 +1749,7 @@ programmer
type = "jtagmkii_pdi"; type = "jtagmkii_pdi";
connection_type = serial; connection_type = serial;
baudrate = 115200; baudrate = 115200;
hvupdi_support = 1;
; ;
# #
@ -17122,13 +17135,15 @@ part
# AVR8X tiny family common values # AVR8X tiny family common values
#------------------------------------------------------------ #------------------------------------------------------------
part parent ".avr8x" part parent ".avr8x"
id = ".avr8x_tiny"; id = ".avr8x_tiny";
desc = "AVR8X tiny family common values"; desc = "AVR8X tiny family common values";
family_id = "tinyAVR"; family_id = "tinyAVR";
# Shared UPDI pin, HV on UPDI pin
hvupdi_variant = 0;
memory "userrow" memory "userrow"
size = 0x20; size = 0x20;
offset = 0x1300; offset = 0x1300;
page_size = 0x20; page_size = 0x20;
readsize = 0x100; readsize = 0x100;
@ -17143,13 +17158,15 @@ part parent ".avr8x"
# AVR8X mega family common values # AVR8X mega family common values
#------------------------------------------------------------ #------------------------------------------------------------
part parent ".avr8x" part parent ".avr8x"
id = ".avr8x_mega"; id = ".avr8x_mega";
desc = "AVR8X mega family common values"; desc = "AVR8X mega family common values";
family_id = "megaAVR"; family_id = "megaAVR";
# Dedicated UPDI pin, no HV
hvupdi_variant = 1;
memory "userrow" memory "userrow"
size = 0x40; size = 0x40;
offset = 0x1300; offset = 0x1300;
page_size = 0x40; page_size = 0x40;
readsize = 0x100; readsize = 0x100;
@ -18248,11 +18265,13 @@ part parent ".avr8x_mega"
#------------------------------------------------------------ #------------------------------------------------------------
part part
id = ".avrdx"; id = ".avrdx";
desc = "AVR-Dx family common values"; desc = "AVR-Dx family common values";
has_updi = yes; has_updi = yes;
nvm_base = 0x1000; nvm_base = 0x1000;
ocd_base = 0x0F80; ocd_base = 0x0F80;
# Dedicated UPDI pin, no HV
hvupdi_variant = 1;
memory "signature" memory "signature"
size = 3; size = 3;
@ -18934,6 +18953,7 @@ part parent ".avrdx"
id = "avr16dd14"; id = "avr16dd14";
desc = "AVR16DD14"; desc = "AVR16DD14";
signature = 0x1E 0x94 0x34; signature = 0x1E 0x94 0x34;
hvupdi_variant = 2;
memory "flash" memory "flash"
size = 0x4000; size = 0x4000;
@ -18958,6 +18978,7 @@ part parent ".avrdx"
id = "avr16dd20"; id = "avr16dd20";
desc = "AVR16DD20"; desc = "AVR16DD20";
signature = 0x1E 0x94 0x33; signature = 0x1E 0x94 0x33;
hvupdi_variant = 2;
memory "flash" memory "flash"
size = 0x4000; size = 0x4000;
@ -18982,6 +19003,7 @@ part parent ".avrdx"
id = "avr16dd28"; id = "avr16dd28";
desc = "AVR16DD28"; desc = "AVR16DD28";
signature = 0x1E 0x94 0x32; signature = 0x1E 0x94 0x32;
hvupdi_variant = 2;
memory "flash" memory "flash"
size = 0x4000; size = 0x4000;
@ -19006,6 +19028,7 @@ part parent ".avrdx"
id = "avr16dd32"; id = "avr16dd32";
desc = "AVR16DD32"; desc = "AVR16DD32";
signature = 0x1E 0x94 0x31; signature = 0x1E 0x94 0x31;
hvupdi_variant = 2;
memory "flash" memory "flash"
size = 0x4000; size = 0x4000;
@ -19030,6 +19053,7 @@ part parent ".avrdx"
id = "avr32dd14"; id = "avr32dd14";
desc = "AVR32DD14"; desc = "AVR32DD14";
signature = 0x1E 0x95 0x3B; signature = 0x1E 0x95 0x3B;
hvupdi_variant = 2;
memory "flash" memory "flash"
size = 0x8000; size = 0x8000;
@ -19054,6 +19078,7 @@ part parent ".avrdx"
id = "avr32dd20"; id = "avr32dd20";
desc = "AVR32DD20"; desc = "AVR32DD20";
signature = 0x1E 0x95 0x3A; signature = 0x1E 0x95 0x3A;
hvupdi_variant = 2;
memory "flash" memory "flash"
size = 0x8000; size = 0x8000;
@ -19078,6 +19103,7 @@ part parent ".avrdx"
id = "avr32dd28"; id = "avr32dd28";
desc = "AVR32DD28"; desc = "AVR32DD28";
signature = 0x1E 0x95 0x39; signature = 0x1E 0x95 0x39;
hvupdi_variant = 2;
memory "flash" memory "flash"
size = 0x8000; size = 0x8000;
@ -19102,6 +19128,7 @@ part parent ".avrdx"
id = "avr32dd32"; id = "avr32dd32";
desc = "AVR32DD32"; desc = "AVR32DD32";
signature = 0x1E 0x95 0x38; signature = 0x1E 0x95 0x38;
hvupdi_variant = 2;
memory "flash" memory "flash"
size = 0x8000; size = 0x8000;
@ -19126,6 +19153,7 @@ part parent ".avrdx"
id = "avr64dd14"; id = "avr64dd14";
desc = "AVR64DD14"; desc = "AVR64DD14";
signature = 0x1E 0x96 0x1D; signature = 0x1E 0x96 0x1D;
hvupdi_variant = 2;
memory "flash" memory "flash"
size = 0x10000; size = 0x10000;
@ -19150,6 +19178,7 @@ part parent ".avrdx"
id = "avr64dd20"; id = "avr64dd20";
desc = "AVR64DD20"; desc = "AVR64DD20";
signature = 0x1E 0x96 0x1C; signature = 0x1E 0x96 0x1C;
hvupdi_variant = 2;
memory "flash" memory "flash"
size = 0x10000; size = 0x10000;
@ -19174,6 +19203,7 @@ part parent ".avrdx"
id = "avr64dd28"; id = "avr64dd28";
desc = "AVR64DD28"; desc = "AVR64DD28";
signature = 0x1E 0x96 0x1B; signature = 0x1E 0x96 0x1B;
hvupdi_variant = 2;
memory "flash" memory "flash"
size = 0x10000; size = 0x10000;
@ -19198,6 +19228,7 @@ part parent ".avrdx"
id = "avr64dd32"; id = "avr64dd32";
desc = "AVR64DD32"; desc = "AVR64DD32";
signature = 0x1E 0x96 0x1A; signature = 0x1E 0x96 0x1A;
hvupdi_variant = 2;
memory "flash" memory "flash"
size = 0x10000; size = 0x10000;
@ -19218,9 +19249,11 @@ part parent ".avrdx"
# AVR-Ex family common values # AVR-Ex family common values
#------------------------------------------------------------ #------------------------------------------------------------
part parent ".avrdx" part parent ".avrdx"
id = ".avrex"; id = ".avrex";
desc = "AVR-Ex family common values"; desc = "AVR-Ex family common values";
# Shared UPDI pin, HV on _RESET
hvupdi_variant = 2;
memory "userrow" memory "userrow"
size = 0x40; size = 0x40;

View File

@ -584,6 +584,7 @@ AVRPART * avr_new_part(void)
memset(p->signature, 0xFF, 3); memset(p->signature, 0xFF, 3);
p->ctl_stack_type = CTL_STACK_NONE; p->ctl_stack_type = CTL_STACK_NONE;
p->ocdrev = -1; p->ocdrev = -1;
p->hvupdi_variant = -1;
p->mem = lcreat(NULL, 0); p->mem = lcreat(NULL, 0);
p->mem_alias = lcreat(NULL, 0); p->mem_alias = lcreat(NULL, 0);

View File

@ -35,6 +35,7 @@
char default_programmer[MAX_STR_CONST]; char default_programmer[MAX_STR_CONST];
char default_parallel[PATH_MAX]; char default_parallel[PATH_MAX];
char default_serial[PATH_MAX]; char default_serial[PATH_MAX];
char default_spi[PATH_MAX];
double default_bitclock; double default_bitclock;
char string_buf[MAX_STR_CONST]; char string_buf[MAX_STR_CONST];

View File

@ -79,8 +79,11 @@ static int pin_name;
%token K_DEFAULT_PARALLEL %token K_DEFAULT_PARALLEL
%token K_DEFAULT_PROGRAMMER %token K_DEFAULT_PROGRAMMER
%token K_DEFAULT_SERIAL %token K_DEFAULT_SERIAL
%token K_DEFAULT_SPI
%token K_DESC %token K_DESC
%token K_FAMILY_ID %token K_FAMILY_ID
%token K_HVUPDI_SUPPORT
%token K_HVUPDI_VARIANT
%token K_DEVICECODE %token K_DEVICECODE
%token K_STK500_DEVCODE %token K_STK500_DEVCODE
%token K_AVR910_DEVCODE %token K_AVR910_DEVCODE
@ -115,6 +118,7 @@ static int pin_name;
%token K_RESET %token K_RESET
%token K_RETRY_PULSE %token K_RETRY_PULSE
%token K_SERIAL %token K_SERIAL
%token K_SPI
%token K_SCK %token K_SCK
%token K_SIGNATURE %token K_SIGNATURE
%token K_SIZE %token K_SIZE
@ -254,6 +258,12 @@ def :
free_token($3); free_token($3);
} | } |
K_DEFAULT_SPI TKN_EQUAL TKN_STRING TKN_SEMI {
strncpy(default_spi, $3->value.string, PATH_MAX);
default_spi[PATH_MAX-1] = 0;
free_token($3);
} |
K_DEFAULT_BITCLOCK TKN_EQUAL number_real TKN_SEMI { K_DEFAULT_BITCLOCK TKN_EQUAL number_real TKN_SEMI {
default_bitclock = $3->value.number_real; default_bitclock = $3->value.number_real;
free_token($3); free_token($3);
@ -475,7 +485,8 @@ prog_parm :
current_prog->baudrate = $3->value.number; current_prog->baudrate = $3->value.number;
free_token($3); free_token($3);
} }
} } |
prog_parm_updi
; ;
prog_parm_type: prog_parm_type:
@ -507,7 +518,8 @@ prog_parm_conntype:
prog_parm_conntype_id: prog_parm_conntype_id:
K_PARALLEL { current_prog->conntype = CONNTYPE_PARALLEL; } | K_PARALLEL { current_prog->conntype = CONNTYPE_PARALLEL; } |
K_SERIAL { current_prog->conntype = CONNTYPE_SERIAL; } | K_SERIAL { current_prog->conntype = CONNTYPE_SERIAL; } |
K_USB { current_prog->conntype = CONNTYPE_USB; } K_USB { current_prog->conntype = CONNTYPE_USB; } |
K_SPI { current_prog->conntype = CONNTYPE_SPI; }
; ;
prog_parm_usb: prog_parm_usb:
@ -576,6 +588,38 @@ usb_pid_list:
} }
; ;
prog_parm_updi:
K_HVUPDI_SUPPORT TKN_EQUAL hvupdi_support_list
;
hvupdi_support_list:
TKN_NUMBER {
{
/* overwrite list entries, so clear the existing entries */
ldestroy_cb(current_prog->hvupdi_support, free);
current_prog->hvupdi_support = lcreat(NULL, 0);
}
{
int *ip = malloc(sizeof(int));
if (ip) {
*ip = $1->value.number;
ladd(current_prog->hvupdi_support, ip);
}
free_token($1);
}
} |
hvupdi_support_list TKN_COMMA TKN_NUMBER {
{
int *ip = malloc(sizeof(int));
if (ip) {
*ip = $3->value.number;
ladd(current_prog->hvupdi_support, ip);
}
free_token($3);
}
}
;
pin_number_non_empty: pin_number_non_empty:
TKN_NUMBER { if(0 != assign_pin(pin_name, $1, 0)) YYABORT; } TKN_NUMBER { if(0 != assign_pin(pin_name, $1, 0)) YYABORT; }
| |
@ -676,6 +720,12 @@ part_parm :
free_token($3); free_token($3);
} | } |
K_HVUPDI_VARIANT TKN_EQUAL TKN_NUMBER
{
current_part->hvupdi_variant = $3->value.number;
free_token($3);
} |
K_DEVICECODE TKN_EQUAL TKN_NUMBER { K_DEVICECODE TKN_EQUAL TKN_NUMBER {
{ {
yyerror("devicecode is deprecated, use " yyerror("devicecode is deprecated, use "

View File

@ -250,7 +250,8 @@ See below for the limitations of debugWire.
For ATxmega devices, the JTAG ICE mkII/3 is supported in PDI mode, provided it For ATxmega devices, the JTAG ICE mkII/3 is supported in PDI mode, provided it
has a revision 1 hardware and firmware version of at least 5.37 (decimal). has a revision 1 hardware and firmware version of at least 5.37 (decimal).
The Atmel-ICE (ARM/AVR) is supported (JTAG, PDI for Xmega, debugWIRE, ISP modes). The Atmel-ICE (ARM/AVR) is supported (JTAG, PDI for Xmega, debugWIRE, ISP,
UPDI).
Atmel's XplainedPro boards, using EDBG protocol (CMSIS-DAP compliant), are Atmel's XplainedPro boards, using EDBG protocol (CMSIS-DAP compliant), are
supported by the ``jtag3'' programmer type. supported by the ``jtag3'' programmer type.
@ -854,10 +855,15 @@ accepting extended parameters.
@table @code @table @code
@item JTAG ICE mkII/3 @item JTAG ICE mkII/3
@itemx Atmel-ICE
@itemx PICkit 4
@itemx MPLAB SNAP
@itemx Power Debugger
@itemx AVR Dragon @itemx AVR Dragon
When using the JTAG ICE mkII/3 or AVR Dragon in JTAG mode, the When using the JTAG ICE mkII, JTAGICE3, Atmel-ICE, PICkit 4, MPLAB SNAP,
following extended parameter is accepted: Power Debugger or AVR Dragon in JTAG mode, the following extended parameter
is accepted:
@table @code @table @code
@item @samp{jtagchain=UB,UA,BB,BA} @item @samp{jtagchain=UB,UA,BB,BA}
Setup the JTAG scan chain for @var{UB} units before, @var{UA} units Setup the JTAG scan chain for @var{UB} units before, @var{UA} units
@ -867,6 +873,14 @@ Each AVR unit within the chain shifts by 4 bits.
Other JTAG units might require a different bit shift count. Other JTAG units might require a different bit shift count.
@end table @end table
The PICkit 4 and the Power Debugger also supports high-voltage UPDI programming.
This is used to enable a UPDI pin that has previously been set to RESET or
GPIO mode. High-voltage UPDI can be utilized by using an extended parameter:
@table @code
@item @samp{hvupdi}
Enable high-voltage UPDI initialization for targets that supports this.
@end table
@cindex @code{-x} AVR910 @cindex @code{-x} AVR910
@item AVR910 @item AVR910

View File

@ -71,6 +71,9 @@ struct pdata
/* Start address of Xmega boot area */ /* Start address of Xmega boot area */
unsigned long boot_start; unsigned long boot_start;
/* Flag for triggering HV UPDI */
bool use_hvupdi;
/* Function to set the appropriate clock parameter */ /* Function to set the appropriate clock parameter */
int (*set_sck)(PROGRAMMER *, unsigned char *); int (*set_sck)(PROGRAMMER *, unsigned char *);
}; };
@ -1204,6 +1207,7 @@ static int jtag3_initialize(PROGRAMMER * pgm, AVRPART * p)
u16_to_b2(xd.nvm_base_addr, p->nvm_base); u16_to_b2(xd.nvm_base_addr, p->nvm_base);
u16_to_b2(xd.ocd_base_addr, p->ocd_base); u16_to_b2(xd.ocd_base_addr, p->ocd_base);
xd.hvupdi_variant = p->hvupdi_variant;
for (ln = lfirst(p->mem); ln; ln = lnext(ln)) for (ln = lfirst(p->mem); ln; ln = lnext(ln))
{ {
@ -1258,6 +1262,29 @@ static int jtag3_initialize(PROGRAMMER * pgm, AVRPART * p)
} }
} }
// Generate UPDI high-voltage pulse if user asks for it and hardware supports it
LNODEID support;
if (p->flags & AVRPART_HAS_UPDI &&
PDATA(pgm)->use_hvupdi == true &&
p->hvupdi_variant != HV_UPDI_VARIANT_1) {
parm[0] = PARM3_UPDI_HV_NONE;
for (support = lfirst(pgm->hvupdi_support); support != NULL; support = lnext(support)) {
if(*(int *) ldata(support) == p->hvupdi_variant) {
avrdude_message(MSG_NOTICE, "%s: Sending HV pulse to targets %s pin\n",
progname, p->hvupdi_variant == HV_UPDI_VARIANT_0 ? "UPDI" : "RESET");
parm[0] = PARM3_UPDI_HV_SIMPLE_PULSE;
break;
}
if (parm[0] == PARM3_UPDI_HV_NONE) {
avrdude_message(MSG_INFO, "%s: %s does not support sending HV pulse to target %s\n",
progname, pgm->desc, p->desc);
return -1;
}
}
if (jtag3_setparm(pgm, SCOPE_AVR, 3, PARM3_OPT_12V_UPDI_ENABLE, parm, 1) < 0)
return -1;
}
u16_to_b2(xd.default_min_div1_voltage, DEFAULT_MINIMUM_CHARACTERISED_DIV1_VOLTAGE_MV); u16_to_b2(xd.default_min_div1_voltage, DEFAULT_MINIMUM_CHARACTERISED_DIV1_VOLTAGE_MV);
u16_to_b2(xd.default_min_div2_voltage, DEFAULT_MINIMUM_CHARACTERISED_DIV2_VOLTAGE_MV); u16_to_b2(xd.default_min_div2_voltage, DEFAULT_MINIMUM_CHARACTERISED_DIV2_VOLTAGE_MV);
u16_to_b2(xd.default_min_div4_voltage, DEFAULT_MINIMUM_CHARACTERISED_DIV4_VOLTAGE_MV); u16_to_b2(xd.default_min_div4_voltage, DEFAULT_MINIMUM_CHARACTERISED_DIV4_VOLTAGE_MV);
@ -1483,6 +1510,12 @@ static int jtag3_parseextparms(PROGRAMMER * pgm, LISTID extparms)
continue; continue;
} }
else if ((strcmp(extended_param, "hvupdi") == 0) &&
(lsize(pgm->hvupdi_support) > 1)) {
PDATA(pgm)->use_hvupdi = true;
continue;
}
avrdude_message(MSG_INFO, "%s: jtag3_parseextparms(): invalid extended parameter '%s'\n", avrdude_message(MSG_INFO, "%s: jtag3_parseextparms(): invalid extended parameter '%s'\n",
progname, extended_param); progname, extended_param);
rv = -1; rv = -1;
@ -1630,6 +1663,12 @@ static int jtag3_open_updi(PROGRAMMER * pgm, char * port)
{ {
avrdude_message(MSG_NOTICE2, "%s: jtag3_open_updi()\n", progname); avrdude_message(MSG_NOTICE2, "%s: jtag3_open_updi()\n", progname);
LNODEID ln;
avrdude_message(MSG_NOTICE2, "%s: HV UPDI support:", progname);
for (ln = lfirst(pgm->hvupdi_support); ln; ln = lnext(ln))
avrdude_message(MSG_NOTICE2, " %d", *(int *) ldata(ln));
avrdude_message(MSG_NOTICE2, "\n", progname);
if (jtag3_open_common(pgm, port) < 0) if (jtag3_open_common(pgm, port) < 0)
return -1; return -1;
@ -2606,6 +2645,7 @@ void jtag3_updi_initpgm(PROGRAMMER * pgm)
* mandatory functions * mandatory functions
*/ */
pgm->initialize = jtag3_initialize; pgm->initialize = jtag3_initialize;
pgm->parseextparams = jtag3_parseextparms;
pgm->display = jtag3_display; pgm->display = jtag3_display;
pgm->enable = jtag3_enable; pgm->enable = jtag3_enable;
pgm->disable = jtag3_disable; pgm->disable = jtag3_disable;

View File

@ -237,6 +237,14 @@
#define PARM3_OPT_12V_UPDI_ENABLE 0x06 #define PARM3_OPT_12V_UPDI_ENABLE 0x06
#define PARM3_OPT_CHIP_ERASE_TO_ENTER 0x07 #define PARM3_OPT_CHIP_ERASE_TO_ENTER 0x07
/*
* UPDI high-voltage enable modes
*/
#define PARM3_UPDI_HV_NONE 0x00 /* Do not use high-voltage */
#define PARM3_UPDI_HV_SIMPLE_PULSE 0x01 /* Issue a single high-voltage pulse immediately*/
#define PARM3_UPDI_HV_AUTO_POWER_TOGGLE 0x02 /* Toggle power automatically and then apply a high-voltage pulse */
#define PARM3_UPDI_HV_USER_POWER_TOGGLE 0x03 /* The user toggles power, and the tool applies a high-voltage pulse on power-up */
/* Xmega erase memory types, for CMND_XMEGA_ERASE */ /* Xmega erase memory types, for CMND_XMEGA_ERASE */
#define XMEGA_ERASE_CHIP 0x00 #define XMEGA_ERASE_CHIP 0x00
#define XMEGA_ERASE_APP 0x01 #define XMEGA_ERASE_APP 0x01
@ -393,5 +401,7 @@ struct updi_device_desc {
unsigned char flash_page_size_msb; // Extends flash_page_size, used in 24-bit mode unsigned char flash_page_size_msb; // Extends flash_page_size, used in 24-bit mode
unsigned char address_mode; // 0x00 = 16-bit mode, 0x01 = 24-bit mode unsigned char address_mode; // 0x00 = 16-bit mode, 0x01 = 24-bit mode
unsigned char hvupdi_variant; // Indicates the target UPDI HV implementation
}; };
#endif /* JTAG3_PRIVATE_EXPORTED */ #endif /* JTAG3_PRIVATE_EXPORTED */

View File

@ -139,6 +139,7 @@ default_bitclock { yylval=NULL; return K_DEFAULT_BITCLOCK; }
default_parallel { yylval=NULL; return K_DEFAULT_PARALLEL; } default_parallel { yylval=NULL; return K_DEFAULT_PARALLEL; }
default_programmer { yylval=NULL; return K_DEFAULT_PROGRAMMER; } default_programmer { yylval=NULL; return K_DEFAULT_PROGRAMMER; }
default_serial { yylval=NULL; return K_DEFAULT_SERIAL; } default_serial { yylval=NULL; return K_DEFAULT_SERIAL; }
default_spi { yylval=NULL; return K_DEFAULT_SPI; }
delay { yylval=NULL; return K_DELAY; } delay { yylval=NULL; return K_DELAY; }
desc { yylval=NULL; return K_DESC; } desc { yylval=NULL; return K_DESC; }
family_id { yylval=NULL; return K_FAMILY_ID; } family_id { yylval=NULL; return K_FAMILY_ID; }
@ -159,6 +160,8 @@ hventerstabdelay { yylval=NULL; return K_HVENTERSTABDELAY; }
hvleavestabdelay { yylval=NULL; return K_HVLEAVESTABDELAY; } hvleavestabdelay { yylval=NULL; return K_HVLEAVESTABDELAY; }
hvsp_controlstack { yylval=NULL; return K_HVSP_CONTROLSTACK; } hvsp_controlstack { yylval=NULL; return K_HVSP_CONTROLSTACK; }
hvspcmdexedelay { yylval=NULL; return K_HVSPCMDEXEDELAY; } hvspcmdexedelay { yylval=NULL; return K_HVSPCMDEXEDELAY; }
hvupdi_support { yylval=NULL; return K_HVUPDI_SUPPORT; }
hvupdi_variant { yylval=NULL; return K_HVUPDI_VARIANT; }
id { yylval=NULL; return K_ID; } id { yylval=NULL; return K_ID; }
idr { yylval=NULL; return K_IDR; } idr { yylval=NULL; return K_IDR; }
io { yylval=new_token(K_IO); return K_IO; } io { yylval=new_token(K_IO); return K_IO; }
@ -222,6 +225,7 @@ sck { yylval=new_token(K_SCK); return K_SCK; }
serial { yylval=NULL; return K_SERIAL; } serial { yylval=NULL; return K_SERIAL; }
signature { yylval=NULL; return K_SIGNATURE; } signature { yylval=NULL; return K_SIGNATURE; }
size { yylval=NULL; return K_SIZE; } size { yylval=NULL; return K_SIZE; }
spi { yylval=NULL; return K_SPI; }
spmcr { yylval=NULL; return K_SPMCR; } spmcr { yylval=NULL; return K_SPMCR; }
stabdelay { yylval=NULL; return K_STABDELAY; } stabdelay { yylval=NULL; return K_STABDELAY; }
stk500_devcode { yylval=NULL; return K_STK500_DEVCODE; } stk500_devcode { yylval=NULL; return K_STK500_DEVCODE; }

View File

@ -198,6 +198,10 @@ typedef struct opcode {
#define AVRPART_IS_AT90S1200 0x1000 /* part is an AT90S1200 (needs special treatment) */ #define AVRPART_IS_AT90S1200 0x1000 /* part is an AT90S1200 (needs special treatment) */
#define AVRPART_HAS_UPDI 0x2000 /* part has UPDI i/f (AVR8X) */ #define AVRPART_HAS_UPDI 0x2000 /* part has UPDI i/f (AVR8X) */
#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) */
#define AVR_DESCLEN 64 #define AVR_DESCLEN 64
#define AVR_IDLEN 32 #define AVR_IDLEN 32
#define AVR_FAMILYIDLEN 7 #define AVR_FAMILYIDLEN 7
@ -212,6 +216,7 @@ typedef struct avrpart {
char desc[AVR_DESCLEN]; /* long part name */ char desc[AVR_DESCLEN]; /* long part name */
char id[AVR_IDLEN]; /* short part name */ char id[AVR_IDLEN]; /* short part name */
char family_id[AVR_FAMILYIDLEN+1]; /* family id in the SIB (avr8x) */ char family_id[AVR_FAMILYIDLEN+1]; /* family id in the SIB (avr8x) */
int hvupdi_variant; /* HV pulse on UPDI pin, no pin or RESET pin */
int stk500_devcode; /* stk500 device code */ int stk500_devcode; /* stk500 device code */
int avr910_devcode; /* avr910 device code */ int avr910_devcode; /* avr910 device code */
int chip_erase_delay; /* microseconds */ int chip_erase_delay; /* microseconds */
@ -645,7 +650,8 @@ typedef enum {
typedef enum { typedef enum {
CONNTYPE_PARALLEL, CONNTYPE_PARALLEL,
CONNTYPE_SERIAL, CONNTYPE_SERIAL,
CONNTYPE_USB CONNTYPE_USB,
CONNTYPE_SPI
} conntype_t; } conntype_t;
typedef struct programmer_t { typedef struct programmer_t {
@ -724,6 +730,7 @@ typedef struct programmer_t {
int lineno; /* config file line number */ int lineno; /* config file line number */
void *cookie; /* for private use by the programmer */ void *cookie; /* for private use by the programmer */
char flag; /* for private use of the programmer */ char flag; /* for private use of the programmer */
LISTID hvupdi_support; /* List of UPDI HV variants the tool supports. See HV_UPDI_VARIANT_ */
} PROGRAMMER; } PROGRAMMER;
#ifdef __cplusplus #ifdef __cplusplus
@ -924,6 +931,7 @@ extern LISTID programmers;
extern char default_programmer[]; extern char default_programmer[];
extern char default_parallel[]; extern char default_parallel[];
extern char default_serial[]; extern char default_serial[];
extern char default_spi[];
extern double default_bitclock; extern double default_bitclock;
/* This name is fixed, it's only here for symmetry with /* This name is fixed, it's only here for symmetry with

View File

@ -135,72 +135,6 @@ static void usage(void)
} }
static void update_progress_tty (int percent, double etime, char *hdr)
{
static char hashes[51];
static char *header;
static int last = 0;
int i;
setvbuf(stderr, (char*)NULL, _IONBF, 0);
hashes[50] = 0;
memset (hashes, ' ', 50);
for (i=0; i<percent; i+=2) {
hashes[i/2] = '#';
}
if (hdr) {
avrdude_message(MSG_INFO, "\n");
last = 0;
header = hdr;
}
if (last == 0) {
avrdude_message(MSG_INFO, "\r%s | %s | %d%% %0.2fs",
header, hashes, percent, etime);
}
if (percent == 100) {
if (!last) avrdude_message(MSG_INFO, "\n\n");
last = 1;
}
setvbuf(stderr, (char*)NULL, _IOLBF, 0);
}
static void update_progress_no_tty (int percent, double etime, char *hdr)
{
static int done = 0;
static int last = 0;
int cnt = (percent>>1)*2;
setvbuf(stderr, (char*)NULL, _IONBF, 0);
if (hdr) {
avrdude_message(MSG_INFO, "\n%s | ", hdr);
last = 0;
done = 0;
}
else {
while ((cnt > last) && (done == 0)) {
avrdude_message(MSG_INFO, "#");
cnt -= 2;
}
}
if ((percent == 100) && (done == 0)) {
avrdude_message(MSG_INFO, " | 100%% %0.2fs\n\n", etime);
last = 0;
done = 1;
}
else
last = (percent>>1)*2; /* Make last a multiple of 2. */
setvbuf(stderr, (char*)NULL, _IOLBF, 0);
}
static void list_programmers_callback(const char *name, const char *desc, static void list_programmers_callback(const char *name, const char *desc,
const char *cfgname, int cfglineno, const char *cfgname, int cfglineno,
void *cookie) void *cookie)
@ -383,6 +317,7 @@ int main(int argc, char * argv [])
default_parallel[0] = 0; default_parallel[0] = 0;
default_serial[0] = 0; default_serial[0] = 0;
default_spi[0] = 0;
default_bitclock = 0.0; default_bitclock = 0.0;
init_config(); init_config();
@ -759,18 +694,8 @@ int main(int argc, char * argv [])
} }
#endif #endif
if (quell_progress == 0) { if (quell_progress == 0)
if (isatty (STDERR_FILENO)) terminal_setup_update_progress();
update_progress = update_progress_tty;
else {
update_progress = update_progress_no_tty;
/* disable all buffering of stderr for compatibility with
software that captures and redirects output to a GUI
i.e. Programmers Notepad */
setvbuf( stderr, NULL, _IONBF, 0 );
setvbuf( stdout, NULL, _IONBF, 0 );
}
}
/* /*
* Print out an identifying string so folks can tell what version * Print out an identifying string so folks can tell what version
@ -932,6 +857,12 @@ int main(int argc, char * argv [])
case CONNTYPE_USB: case CONNTYPE_USB:
port = DEFAULT_USB; port = DEFAULT_USB;
break; break;
#ifdef HAVE_LINUXSPI
case CONNTYPE_SPI:
port = *default_spi ? default_spi : "unknown";
break;
#endif
} }
} }

View File

@ -83,6 +83,7 @@ PROGRAMMER * pgm_new(void)
pgm->lineno = 0; pgm->lineno = 0;
pgm->baudrate = 0; pgm->baudrate = 0;
pgm->initpgm = NULL; pgm->initpgm = NULL;
pgm->hvupdi_support = lcreat(NULL, 0);
for (i=0; i<N_PINS; i++) { for (i=0; i<N_PINS; i++) {
pgm->pinno[i] = 0; pgm->pinno[i] = 0;

File diff suppressed because it is too large Load Diff

View File

@ -34,6 +34,8 @@ typedef enum {
int terminal_mode(PROGRAMMER * pgm, struct avrpart * p); int terminal_mode(PROGRAMMER * pgm, struct avrpart * p);
char * terminal_get_input(const char *prompt); char * terminal_get_input(const char *prompt);
void terminal_setup_update_progress();
int terminal_message(const int msglvl, const char *format, ...);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -657,15 +657,39 @@ static int usbtiny_paged_load (PROGRAMMER * pgm, AVRPART * p, AVRMEM* m,
unsigned int addr, unsigned int n_bytes) unsigned int addr, unsigned int n_bytes)
{ {
unsigned int maxaddr = addr + n_bytes; unsigned int maxaddr = addr + n_bytes;
int chunk; int chunk, function;
int function; OPCODE *lext, *readop;
unsigned char cmd[8];
// First determine what we're doing // First determine what we're doing
if (strcmp( m->desc, "flash" ) == 0) { function = strcmp(m->desc, "eeprom")==0?
function = USBTINY_FLASH_READ; USBTINY_EEPROM_READ: USBTINY_FLASH_READ;
} else {
function = USBTINY_EEPROM_READ; // paged_load() only called for pages, so OK to set ext addr once at start
if((lext = m->op[AVR_OP_LOAD_EXT_ADDR])) {
memset(cmd, 0, sizeof(cmd));
avr_set_bits(lext, cmd);
avr_set_addr(lext, cmd, addr/2);
if(pgm->cmd(pgm, cmd, cmd+4) < 0)
return -1;
}
// Byte acces as work around to correctly read flash above 64 kiB
if(function == USBTINY_FLASH_READ && addr >= 0x10000) {
for(unsigned int i=0; i<n_bytes; i++, addr++) {
if(!(readop = m->op[addr&1? AVR_OP_READ_HI: AVR_OP_READ_LO]))
return -1;
memset(cmd, 0, sizeof(cmd));
avr_set_bits(readop, cmd);
avr_set_addr(readop, cmd, addr/2);
if(pgm->cmd(pgm, cmd, cmd+4) < 0)
return -1;
m->buf[addr] = 0;
avr_get_output(readop, cmd+4, m->buf + addr);
}
return n_bytes;
} }
for (; addr < maxaddr; addr += chunk) { for (; addr < maxaddr; addr += chunk) {