diff --git a/ChangeLog b/ChangeLog index 0e606b3f..fb6d3b2e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2021-11-06 Joerg Wunsch + + Submitted by Jan Egil Ruud: + patch #10000: Add support for extended UPDI device context + * avrdude.conf.in (pickit4_updi, snap_updi, pkobn_updi): + new programmers + * avrdude.conf.in (ATmega808, ATmega809, ATmega1608, ATmega1609) + (AVR DA, AVR DB): new devices + * jtag3.c: Add support for extended UPDI device context + * jtag3_private.h: (Dito.) + * tools/atdf-to-avrdude.xslt: Bug fixes + * usbdevs.h: Bump USBDEV_MAX_XFER_3 to 912 + * doc/avrdude.texi: Document changes + * avrdude.1: (Dito) + 2021-06-27 Joerg Wunsch bug #60753: Patch #1436 breaks multiple programmer/device combinations on MacOS BigSur diff --git a/NEWS b/NEWS index 08161caa..0d4fbc14 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,7 @@ Current: - AVR Doper uses libhidapi rather than raw libusb (patch #9033) - -P net:host:port can use IPv6 now (Posix systems only) - New configure option: -disable-libusb_1_0 + - extended UPDI device context (> 64 Ki flash) * New devices supported: @@ -31,6 +32,7 @@ Current: - ATtiny841, ATtiny441 - ATmega64M1 - ATmega324A + - ATmega808, ATmega809, ATmega1608, ATmega1609, AVR DA, AVR DB * New programmers supported: @@ -40,6 +42,7 @@ Current: - JTAGICE3 in UPDI mode - Atmel Powerdebugger in all modes (JTAG, PDI, UPDI, debugWIRE, ISP) - linuxspi (direct SPI bus e.g. on Raspberry Pi devices) + - PICkit4, Snap, PKoB * Bugfixes: bug #47550: Linux GPIO broken @@ -85,6 +88,7 @@ Current: patch #9816: Implement new programmer type: linuxspi patch #9811: ATmega328pb has efuse bit 3 patch #9744: Patch for ATMega324A support + patch #10000: Add support for extended UPDI device context * Internals: - New avrdude.conf keyword "family_id", used to verify SIB attributes diff --git a/avrdude.1 b/avrdude.1 index 1518b8c6..aa4c697f 100644 --- a/avrdude.1 +++ b/avrdude.1 @@ -219,6 +219,12 @@ The Atmel DFU bootloader is supported in both, FLIP protocol version 1 (AT90USB* and ATmega*U* devices), as well as version 2 (Xmega devices). See below for some hints about FLIP version 1 protocol behaviour. .Pp +The MPLAB(R) PICkit 4, MPLAB(R) SNAP, and Curiosity Nano boards are +supported in UPDI mode. The Curiosity Nano board is dubbed +.Dq PICkit on Board , +thus the name +.Pa pkobn_updi . +.Pp Input files can be provided, and output files can be written in different file formats, such as raw binary files containing the data to download to the chip, Intel hex format, or Motorola S-record diff --git a/avrdude.conf.in b/avrdude.conf.in index f5f6a063..fd3930ae 100644 --- a/avrdude.conf.in +++ b/avrdude.conf.in @@ -1229,6 +1229,30 @@ programmer usbpid = 0x2144; ; +programmer + id = "pickit4_updi"; + desc = "MPLAB(R) PICkit 4 in UPDI mode"; + type = "jtagice3_updi"; + connection_type = usb; + usbpid = 0x2177, 0x2178, 0x2179; +; + +programmer + id = "snap_updi"; + desc = "MPLAB(R) SNAP in UPDI mode"; + type = "jtagice3_updi"; + connection_type = usb; + usbpid = 0x217F, 0x2180, 0x2181; +; + +programmer + id = "pkobn_updi"; + desc = "Curiosity nano (nEDBG) in UPDI mode"; + type = "jtagice3_updi"; + connection_type = usb; + usbpid = 0x2175; +; + programmer id = "pavr"; desc = "Jason Kyle's pAVR Serial Programmer"; @@ -15267,6 +15291,7 @@ part memory "signature" size = 3; offset = 0x1100; + readsize = 0x3; ; memory "prodsig" @@ -15279,51 +15304,62 @@ part memory "fuses" size = 9; offset = 0x1280; + page_size = 0x0A; + readsize = 0x0A; ; memory "fuse0" size = 1; offset = 0x1280; + readsize = 1; ; memory "fuse1" size = 1; offset = 0x1281; + readsize = 1; ; memory "fuse2" size = 1; offset = 0x1282; + readsize = 1; ; memory "fuse4" size = 1; offset = 0x1284; + readsize = 1; ; memory "fuse5" size = 1; offset = 0x1285; + readsize = 1; ; memory "fuse6" size = 1; offset = 0x1286; + readsize = 1; ; memory "fuse7" size = 1; offset = 0x1287; + readsize = 1; ; memory "fuse8" size = 1; offset = 0x1288; + readsize = 1; ; memory "lock" size = 1; offset = 0x128a; + readsize = 1; ; memory "data" @@ -15421,7 +15457,7 @@ part parent ".avr8x_tiny" part parent ".avr8x_tiny" id = "t402"; desc = "ATtiny402"; - signature = 0x1E 0x92 0x23; + signature = 0x1E 0x92 0x27; memory "flash" size = 0x1000; @@ -15922,30 +15958,6 @@ part parent ".avr8x_tiny" ; ; -#------------------------------------------------------------ -# ATtiny3214 -#------------------------------------------------------------ - -part parent ".avr8x_tiny" - id = "t3214"; - desc = "ATtiny3214"; - signature = 0x1E 0x95 0x20; - - memory "flash" - size = 0x8000; - offset = 0x8000; - page_size = 0x80; - readsize = 0x100; - ; - - memory "eeprom" - size = 0x100; - offset = 0x1400; - page_size = 0x40; - readsize = 0x100; - ; -; - #------------------------------------------------------------ # ATtiny3216 #------------------------------------------------------------ @@ -15994,6 +16006,317 @@ part parent ".avr8x_tiny" ; ; +#------------------------------------------------------------ +# ATtiny424 +#------------------------------------------------------------ + +part parent ".avr8x_tiny" + id = "t424"; + desc = "ATtiny424"; + signature = 0x1E 0x92 0x2C; + + memory "flash" + size = 0x1000; + offset = 0x8000; + page_size = 0x40; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x80; + offset = 0x1400; + page_size = 0x20; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# ATtiny426 +#------------------------------------------------------------ + +part parent ".avr8x_tiny" + id = "t426"; + desc = "ATtiny426"; + signature = 0x1E 0x92 0x2B; + + memory "flash" + size = 0x1000; + offset = 0x8000; + page_size = 0x40; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x80; + offset = 0x1400; + page_size = 0x20; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# ATtiny427 +#------------------------------------------------------------ + +part parent ".avr8x_tiny" + id = "t427"; + desc = "ATtiny427"; + signature = 0x1E 0x92 0x2A; + + memory "flash" + size = 0x1000; + offset = 0x8000; + page_size = 0x40; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x80; + offset = 0x1400; + page_size = 0x20; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# ATtiny824 +#------------------------------------------------------------ + +part parent ".avr8x_tiny" + id = "t824"; + desc = "ATtiny824"; + signature = 0x1E 0x93 0x29; + + memory "flash" + size = 0x2000; + offset = 0x8000; + page_size = 0x40; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x80; + offset = 0x1400; + page_size = 0x20; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# ATtiny826 +#------------------------------------------------------------ + +part parent ".avr8x_tiny" + id = "t826"; + desc = "ATtiny826"; + signature = 0x1E 0x93 0x28; + + memory "flash" + size = 0x2000; + offset = 0x8000; + page_size = 0x40; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x80; + offset = 0x1400; + page_size = 0x20; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# ATtiny827 +#------------------------------------------------------------ + +part parent ".avr8x_tiny" + id = "t827"; + desc = "ATtiny827"; + signature = 0x1E 0x93 0x27; + + memory "flash" + size = 0x2000; + offset = 0x8000; + page_size = 0x40; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x80; + offset = 0x1400; + page_size = 0x20; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# ATtiny1624 +#------------------------------------------------------------ + +part parent ".avr8x_tiny" + id = "t1624"; + desc = "ATtiny1624"; + signature = 0x1E 0x94 0x2A; + + memory "flash" + size = 0x4000; + offset = 0x8000; + page_size = 0x40; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x100; + offset = 0x1400; + page_size = 0x20; + readsize = 0x100; + ; +; +#------------------------------------------------------------ +# ATtiny1626 +#------------------------------------------------------------ + +part parent ".avr8x_tiny" + id = "t1626"; + desc = "ATtiny1626"; + signature = 0x1E 0x94 0x29; + + memory "flash" + size = 0x4000; + offset = 0x8000; + page_size = 0x40; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x100; + offset = 0x1400; + page_size = 0x20; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# ATtiny1627 +#------------------------------------------------------------ + +part parent ".avr8x_tiny" + id = "t1627"; + desc = "ATtiny1627"; + signature = 0x1E 0x94 0x28; + + memory "flash" + size = 0x4000; + offset = 0x8000; + page_size = 0x40; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x100; + offset = 0x1400; + page_size = 0x20; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# ATmega808 +#------------------------------------------------------------ + +part parent ".avr8x_tiny" + id = "m808"; + desc = "ATmega808"; + signature = 0x1E 0x93 0x26; + + memory "flash" + size = 0x2000; + offset = 0x4000; + page_size = 0x40; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x100; + offset = 0x1400; + page_size = 0x20; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# ATmega809 +#------------------------------------------------------------ + +part parent ".avr8x_tiny" + id = "m809"; + desc = "ATmega809"; + signature = 0x1E 0x93 0x2A; + + memory "flash" + size = 0x2000; + offset = 0x4000; + page_size = 0x40; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x100; + offset = 0x1400; + page_size = 0x20; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# ATmega1608 +#------------------------------------------------------------ + +part parent ".avr8x_tiny" + id = "m1608"; + desc = "ATmega1608"; + signature = 0x1E 0x94 0x27; + + memory "flash" + size = 0x4000; + offset = 0x4000; + page_size = 0x40; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x100; + offset = 0x1400; + page_size = 0x20; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# ATmega1609 +#------------------------------------------------------------ + +part parent ".avr8x_tiny" + id = "m1609"; + desc = "ATmega1609"; + signature = 0x1E 0x94 0x26; + + memory "flash" + size = 0x4000; + offset = 0x4000; + page_size = 0x40; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x100; + offset = 0x1400; + page_size = 0x20; + readsize = 0x100; + ; +; + #------------------------------------------------------------ # ATmega3208 #------------------------------------------------------------ @@ -16001,7 +16324,7 @@ part parent ".avr8x_tiny" part parent ".avr8x_mega" id = "m3208"; desc = "ATmega3208"; - signature = 0x1E 0x95 0x52; + signature = 0x1E 0x95 0x30; memory "flash" size = 0x8000; @@ -16025,7 +16348,7 @@ part parent ".avr8x_mega" part parent ".avr8x_mega" id = "m3209"; desc = "ATmega3209"; - signature = 0x1E 0x95 0x53; + signature = 0x1E 0x95 0x31; memory "flash" size = 0x8000; @@ -16089,3 +16412,623 @@ part parent ".avr8x_mega" readsize = 0x100; ; ; + +#------------------------------------------------------------ +# AVR-Dx family common values +#------------------------------------------------------------ + +part + id = ".avrdx"; + desc = "AVR-Dx family common values"; + has_updi = yes; + nvm_base = 0x1000; + ocd_base = 0x0F80; + + memory "signature" + size = 3; + offset = 0x1100; + readsize = 0x3; + ; + + memory "prodsig" + size = 0x7D; + offset = 0x1103; + page_size = 0x7D; + readsize = 0x7D; + ; + + memory "fuses" + size = 9; + offset = 0x1050; + page_size = 0x10; + readsize = 0x10; + ; + + memory "fuse0" + size = 1; + offset = 0x1050; + readsize = 1; + ; + + memory "fuse1" + size = 1; + offset = 0x1051; + readsize = 1; + ; + + memory "fuse2" + size = 1; + offset = 0x1052; + readsize = 1; + ; + + memory "fuse4" + size = 1; + offset = 0x1054; + readsize = 1; + ; + + memory "fuse5" + size = 1; + offset = 0x1055; + readsize = 1; + ; + + memory "fuse6" + size = 1; + offset = 0x1056; + readsize = 1; + ; + + memory "fuse7" + size = 1; + offset = 0x1057; + readsize = 1; + ; + + memory "fuse8" + size = 1; + offset = 0x1058; + readsize = 1; + ; + + memory "lock" + size = 4; + offset = 0x1040; + page_size = 0x1; + readsize = 0x4; + ; + + memory "data" + # SRAM, only used to supply the offset + offset = 0x1000000; + ; +; + +#------------------------------------------------------------ +# AVR32DA28 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr32da28"; + desc = "AVR32DA28"; + signature = 0x1E 0x95 0x34; + + memory "flash" + size = 0x8000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR32DA32 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr32da32"; + desc = "AVR32DA32"; + signature = 0x1E 0x95 0x33; + + memory "flash" + size = 0x8000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR32DA48 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr32da48"; + desc = "AVR32DA48"; + signature = 0x1E 0x95 0x32; + + memory "flash" + size = 0x8000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR64DA28 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr64da28"; + desc = "AVR64DA28"; + signature = 0x1E 0x96 0x15; + + memory "flash" + size = 0x10000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR64DA32 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr64da32"; + desc = "AVR64DA32"; + signature = 0x1E 0x96 0x14; + + memory "flash" + size = 0x10000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR64DA48 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr64da48"; + desc = "AVR64DA48"; + signature = 0x1E 0x96 0x13; + + memory "flash" + size = 0x10000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR64DA64 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr64da64"; + desc = "AVR64DA64"; + signature = 0x1E 0x96 0x12; + + memory "flash" + size = 0x10000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR128DA28 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr128da28"; + desc = "AVR128DA28"; + signature = 0x1E 0x97 0x0A; + + memory "flash" + size = 0x20000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR128DA32 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr128da32"; + desc = "AVR128DA32"; + signature = 0x1E 0x97 0x09; + + memory "flash" + size = 0x20000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR128DA48 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr128da48"; + desc = "AVR128DA48"; + signature = 0x1E 0x97 0x08; + + memory "flash" + size = 0x20000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR128DA64 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr128da64"; + desc = "AVR128DA64"; + signature = 0x1E 0x97 0x07; + + memory "flash" + size = 0x20000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR32DB28 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr32db28"; + desc = "AVR32DB28"; + signature = 0x1E 0x95 0x37; + + memory "flash" + size = 0x8000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR32DB32 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr32db32"; + desc = "AVR32DB32"; + signature = 0x1E 0x95 0x36; + + memory "flash" + size = 0x8000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR32DB48 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr32db48"; + desc = "AVR32DB48"; + signature = 0x1E 0x95 0x35; + + memory "flash" + size = 0x8000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR64DB28 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr64db28"; + desc = "AVR64DB28"; + signature = 0x1E 0x96 0x19; + + memory "flash" + size = 0x10000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR64DB32 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr64db32"; + desc = "AVR64DB32"; + signature = 0x1E 0x96 0x18; + + memory "flash" + size = 0x10000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR64DB48 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr64db48"; + desc = "AVR64DB48"; + signature = 0x1E 0x96 0x17; + + memory "flash" + size = 0x10000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR64DB64 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr64db64"; + desc = "AVR64DB64"; + signature = 0x1E 0x96 0x16; + + memory "flash" + size = 0x10000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR128DB28 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr128db28"; + desc = "AVR128DB28"; + signature = 0x1E 0x97 0x0E; + + memory "flash" + size = 0x20000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR128DB32 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr128db32"; + desc = "AVR128DB32"; + signature = 0x1E 0x97 0x0D; + + memory "flash" + size = 0x20000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR128DB48 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr128db48"; + desc = "AVR128DB48"; + signature = 0x1E 0x97 0x0C; + + memory "flash" + size = 0x20000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; + +#------------------------------------------------------------ +# AVR128DB64 +#------------------------------------------------------------ + +part parent ".avrdx" + id = "avr128db64"; + desc = "AVR128DB64"; + signature = 0x1E 0x97 0x0B; + + memory "flash" + size = 0x20000; + offset = 0x800000; + page_size = 0x200; + readsize = 0x100; + ; + + memory "eeprom" + size = 0x200; + offset = 0x1400; + page_size = 0x1; + readsize = 0x100; + ; +; diff --git a/doc/avrdude.texi b/doc/avrdude.texi index 683d7c8f..eaa81b31 100644 --- a/doc/avrdude.texi +++ b/doc/avrdude.texi @@ -287,6 +287,10 @@ The Atmel DFU bootloader is supported in both, FLIP protocol version 1 (AT90USB* and ATmega*U* devices), as well as version 2 (Xmega devices). See below for some hints about FLIP version 1 protocol behaviour. +The MPLAB(R) PICkit 4, MPLAB(R) SNAP, and Curiosity Nano boards are +supported in UPDI mode. The Curiosity Nano board is dubbed ``PICkit on +Board'', thus the name @code{pkobn_updi}. + @menu * History:: diff --git a/jtag3.c b/jtag3.c index f5986f7e..122df1bd 100644 --- a/jtag3.c +++ b/jtag3.c @@ -1181,32 +1181,81 @@ static int jtag3_initialize(PROGRAMMER * pgm, AVRPART * p) m = ldata(ln); if (strcmp(m->desc, "flash") == 0) { - u16_to_b2(xd.prog_base, m->offset); + u16_to_b2(xd.prog_base, m->offset&0xFFFF); + xd.prog_base_msb = m->offset>>16; if (m->readsize != 0 && m->readsize < m->page_size) PDATA(pgm)->flash_pagesize = m->readsize; else PDATA(pgm)->flash_pagesize = m->page_size; - xd.flash_page_size = m->page_size; + xd.flash_page_size = m->page_size & 0xFF; + xd.flash_page_size_msb = (m->page_size)>>8; + + u32_to_b4(xd.flash_bytes, m->size); + + if (m->offset > 0xFFFF) + xd.address_mode = UPDI_ADDRESS_MODE_24BIT; + else + xd.address_mode = UPDI_ADDRESS_MODE_16BIT; } else if (strcmp(m->desc, "eeprom") == 0) { PDATA(pgm)->eeprom_pagesize = m->page_size; xd.eeprom_page_size = m->page_size; + + u16_to_b2(xd.eeprom_bytes, m->size); + u16_to_b2(xd.eeprom_base, m->offset); + } + else if (strcmp(m->desc, "usersig") == 0) + { + u16_to_b2(xd.user_sig_bytes, m->size); + u16_to_b2(xd.user_sig_base, m->offset); + } + else if (strcmp(m->desc, "signature") == 0) + { + u16_to_b2(xd.signature_base, m->offset); + xd.device_id[0] = p->signature[1]; + xd.device_id[1] = p->signature[2]; + } + else if (strcmp(m->desc, "fuses") == 0) + { + xd.fuses_bytes = m->size; + u16_to_b2(xd.fuses_base, m->offset); + } + else if (strcmp(m->desc, "lock") == 0) + { + u16_to_b2(xd.lockbits_base, m->offset); } } + 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_div4_voltage, DEFAULT_MINIMUM_CHARACTERISED_DIV4_VOLTAGE_MV); + u16_to_b2(xd.default_min_div8_voltage, DEFAULT_MINIMUM_CHARACTERISED_DIV8_VOLTAGE_MV); + u16_to_b2(xd.pdi_pad_fmax, MAX_FREQUENCY_SHARED_UPDI_PIN); + xd.syscfg_offset = FUSES_SYSCFG0_OFFSET; + xd.syscfg_write_mask_and = 0xFF; + xd.syscfg_write_mask_or = 0x00; + xd.syscfg_erase_mask_and = 0xFF; + xd.syscfg_erase_mask_or = 0x00; + avrdude_message(MSG_NOTICE2, "UPDI SET: \n\t" + "xd->prog_base_msb=%x\n\t" "xd->prog_base=%x %x\n\t" + "xd->flash_page_size_msb=%x\n\t" "xd->flash_page_size=%x\n\t" "xd->eeprom_page_size=%x\n\t" "xd->nvmctrl=%x %x\n\t" - "xd->ocd=%x %x\n", + "xd->ocd=%x %x\n\t", + "xd->address_mode=%x\n", + xd.prog_base_msb, xd.prog_base[0], xd.prog_base[1], + xd.flash_page_size_msb, xd.flash_page_size, xd.eeprom_page_size, xd.nvm_base_addr[0], xd.nvm_base_addr[1], - xd.ocd_base_addr[0], xd.ocd_base_addr[1]); + xd.ocd_base_addr[0], xd.ocd_base_addr[1], + xd.address_mode); if (jtag3_setparm(pgm, SCOPE_AVR, 2, PARM3_DEVICEDESC, (unsigned char *)&xd, sizeof xd) < 0) return -1; @@ -1787,8 +1836,10 @@ static int jtag3_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m, 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->flags & AVRPART_HAS_PDI ) { cmd[3] = MTYPE_FLASH; + } else if ( p->flags & AVRPART_HAS_UPDI ) { + cmd[3] = MTYPE_SRAM; } else { cmd[3] = MTYPE_SPM; } diff --git a/jtag3_private.h b/jtag3_private.h index 7a2374f0..5ce634f9 100644 --- a/jtag3_private.h +++ b/jtag3_private.h @@ -284,6 +284,16 @@ #define CMSISDAP_CMD_SWD_CONFIGURE 0x13 /* configure SWD protocol; (byte) */ +#define DEFAULT_MINIMUM_CHARACTERISED_DIV1_VOLTAGE_MV 4500 // Default minimum voltage for 32M => 4.5V +#define DEFAULT_MINIMUM_CHARACTERISED_DIV2_VOLTAGE_MV 2700 // Default minimum voltage for 16M => 2.7V +#define DEFAULT_MINIMUM_CHARACTERISED_DIV4_VOLTAGE_MV 2200 // Default minimum voltage for 8M => 2.2V +#define DEFAULT_MINIMUM_CHARACTERISED_DIV8_VOLTAGE_MV 1500 // Default minimum voltage for 4M => 1.5V +#define MAX_FREQUENCY_DEDICATED_UPDI_PIN 1500 +#define MAX_FREQUENCY_SHARED_UPDI_PIN 750 +#define UPDI_ADDRESS_MODE_16BIT 0 +#define UPDI_ADDRESS_MODE_24BIT 1 +#define FUSES_SYSCFG0_OFFSET 5 + #if !defined(JTAG3_PRIVATE_EXPORTED) struct mega_device_desc { @@ -345,5 +355,39 @@ struct updi_device_desc { unsigned char eeprom_page_size; unsigned char nvm_base_addr[2]; unsigned char ocd_base_addr[2]; + + // Configuration below, except for "Extended memory support", is only used by kits with + // embedded debuggers (XPlained, Curiosity, ...). + unsigned char default_min_div1_voltage[2]; // Default minimum voltage for 32M => 4.5V -> 4500 + unsigned char default_min_div2_voltage[2]; // Default minimum voltage for 16M => 2.7V -> 2700 + unsigned char default_min_div4_voltage[2]; // Default minimum voltage for 8M => 2.2V -> 2200 + unsigned char default_min_div8_voltage[2]; // Default minimum voltage for 4M => 1.5V -> 1500 + + unsigned char pdi_pad_fmax[2]; // 750 + + unsigned char flash_bytes[4]; // Flash size in bytes + unsigned char eeprom_bytes[2]; // EEPROM size in bytes + unsigned char user_sig_bytes[2]; // UserSignture size in bytes + unsigned char fuses_bytes; // Fuses size in bytes + + unsigned char syscfg_offset; // Offset of SYSCFG0 within FUSE space + unsigned char syscfg_write_mask_and; // AND mask to apply to SYSCFG0 when writing + unsigned char syscfg_write_mask_or; // OR mask to apply to SYSCFG0 when writing + unsigned char syscfg_erase_mask_and; // AND mask to apply to SYSCFG0 after erase + unsigned char syscfg_erase_mask_or; // OR mask to apply to SYSCFG0 after erase + + unsigned char eeprom_base[2]; // Base address for EEPROM memory + unsigned char user_sig_base[2]; // Base address for UserSignature memory + unsigned char signature_base[2]; // Base address for Signature memory + unsigned char fuses_base[2]; // Base address for Fuses memory + unsigned char lockbits_base[2]; // Base address for Lockbits memory + + unsigned char device_id[2]; // Two last bytes of the device ID + + // Extended memory support. Needed for flash >= 64kb + unsigned char prog_base_msb; // Extends prog_base, 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 }; #endif /* JTAG3_PRIVATE_EXPORTED */ diff --git a/tools/atdf-to-avrdude.xslt b/tools/atdf-to-avrdude.xslt index b4ad4037..786c88a3 100644 --- a/tools/atdf-to-avrdude.xslt +++ b/tools/atdf-to-avrdude.xslt @@ -154,6 +154,9 @@ + + + Unable to deduce device id from '' @@ -166,6 +169,8 @@ .avr8x_tiny .avr8x_mega + .avrdx + .avrex Unable to deduce parent name from '' diff --git a/usbdevs.h b/usbdevs.h index a3bc413c..0dbdb482 100644 --- a/usbdevs.h +++ b/usbdevs.h @@ -69,7 +69,14 @@ #define USBDEV_BULK_EP_WRITE_3 0x01 #define USBDEV_BULK_EP_READ_3 0x82 #define USBDEV_EVT_EP_READ_3 0x83 -#define USBDEV_MAX_XFER_3 512 +/* + * The mk3 tools (type jtagice3) have a maxPayloadSize of 912. When + * accessing paged memory the access should be limited to pageSize. + * When accessing memory without pageSize the payload should be + * limited to 256. + */ +#define USBDEV_MAX_XFER_3 912 +#define USBDEV_MAX_XFER_3_UNPAGED 256 /* * When operating on the JTAGICE3, usbdev_recv_frame() returns an