From eb2fe9b64eb77bf9ae5be50eab94d0c006608aaf Mon Sep 17 00:00:00 2001 From: MX682X <58419867+MX682X@users.noreply.github.com> Date: Thu, 13 Mar 2025 19:01:04 +0100 Subject: [PATCH] updated scripts.xml and added PK Basic in non cimsis-dap mode --- src/avrdude.conf.in | 24 +++++++---- src/pickit5.c | 36 +++++++++------- src/pickit5_lut_isp.c | 8 ++-- src/pickit5_lut_jtag.c | 12 +++--- src/pickit5_lut_updi.c | 93 ++++++++++++++++++++++-------------------- src/usbdevs.h | 42 ++++++++++--------- 6 files changed, 117 insertions(+), 98 deletions(-) diff --git a/src/avrdude.conf.in b/src/avrdude.conf.in index a1d7ef0b..0d9e0d1f 100644 --- a/src/avrdude.conf.in +++ b/src/avrdude.conf.in @@ -3082,11 +3082,11 @@ programmer # pickit4_tpi # Note: pickit5_dw does not support flash erase and must switch # to ISP, thus requires all 6 Pins when modifing the flash # -# (*): The PICkit5 can generate a High-Voltage (12V) Pulse on this pins +# (*): The PICkit 5 can generate a High-Voltage (12V) Pulse on this pins # to restore the UPDI Pin functionality, if it was changed through fuses. # AVRDUDE automatically selects the correct pin, if the HV pulse is # enabled through the '-x hvupdi' flag. -# (°): The PICkit5 can also be used as a USB to UART +# (°): The PICkit 5 and PICkit Basic can also be used as a USB to UART # interface for simple serial debugging. #------------------------------------------------------------ @@ -3101,7 +3101,8 @@ programmer # pickit5 extra_features = HAS_VTARG_READ; connection_type = usb; usbvid = 0x04d8; - usbpid = 0x9036, 0x9012, 0x9018; # PK5, PK4 (pic mode), snap (pic mode) + usbpid = 0x9036, 0x9012, 0x9018, # PK5, PK4 (pic mode), snap (pic mode) + 0x9054, 0x9055; # Pickit basic (guess) ; @@ -3117,8 +3118,9 @@ programmer # pickit5_updi extra_features = HAS_VTARG_READ; connection_type = usb; usbvid = 0x04d8; - usbpid = 0x9036, 0x9012, 0x9018; # PK5, PK4 (pic mode), snap (pic mode) - hvupdi_support = 0, 1, 2; + usbpid = 0x9036, 0x9012, 0x9018, # PK5, PK4 (pic mode), snap (pic mode) + 0x9054, 0x9055; # Pickit basic (guess) + hvupdi_support = 0, 1, 2, 3; ; #------------------------------------------------------------ @@ -3133,7 +3135,8 @@ programmer # pickit5_isp extra_features = HAS_VTARG_READ; connection_type = usb; usbvid = 0x04d8; - usbpid = 0x9036, 0x9012, 0x9018; # PK5, PK4 (pic mode), snap (pic mode) + usbpid = 0x9036, 0x9012, 0x9018, # PK5, PK4 (pic mode), snap (pic mode) + 0x9054, 0x9055; # Pickit basic (guess) ; #------------------------------------------------------------ @@ -3148,7 +3151,8 @@ programmer # pickit5_dw extra_features = HAS_VTARG_READ; connection_type = usb; usbvid = 0x04d8; - usbpid = 0x9036, 0x9012, 0x9018; # PK5, PK4 (pic mode), snap (pic mode) + usbpid = 0x9036, 0x9012, 0x9018, # PK5, PK4 (pic mode), snap (pic mode) + 0x9054, 0x9055; # Pickit basic (guess) ; #------------------------------------------------------------ @@ -3163,7 +3167,8 @@ programmer # pickit5_tpi extra_features = HAS_VTARG_READ; connection_type = usb; usbvid = 0x04d8; - usbpid = 0x9036, 0x9012, 0x9018; # PK5, PK4 (pic mode), snap (pic mode) + usbpid = 0x9036, 0x9012, 0x9018, # PK5, PK4 (pic mode), snap (pic mode) + 0x9054, 0x9055; # Pickit basic (guess) ; #------------------------------------------------------------ @@ -3178,7 +3183,8 @@ programmer # pickit5_pdi extra_features = HAS_VTARG_READ; connection_type = usb; usbvid = 0x04d8; - usbpid = 0x9036, 0x9012, 0x9018; # PK5, PK4 (pic mode), snap (pic mode) + usbpid = 0x9036, 0x9012, 0x9018, # PK5, PK4 (pic mode), snap (pic mode) + 0x9054, 0x9055; # Pickit basic (guess) ; #------------------------------------------------------------ diff --git a/src/pickit5.c b/src/pickit5.c index 813ed596..dcae4c4e 100644 --- a/src/pickit5.c +++ b/src/pickit5.c @@ -58,10 +58,6 @@ #define BIST_TEST 0x02 #define BIST_RESULT 0x03 -#define PGM_TYPE_PK5 0x00 // Default -#define PGM_TYPE_PK4 0x01 // PICkit4 -#define PGM_TYPE_SNAP 0x02 // SNAP - #define PK_OP_NONE 0x00 // Init #define PK_OP_FOUND 0x01 // PK is connected to USB #define PK_OP_RESPONDS 0x02 // Responds to get_fw() requests @@ -77,9 +73,17 @@ #define ERROR_BAD_RESPONSE -13 #define ERROR_SCRIPT_EXECUTION -14 +#define PGM_FEAT_TARGET_POWER 0x01 +#define PGM_FEAT_HV_PULSE 0x02 +#define PGM_FEAT_PTG 0x04 + +#define can_power_target(data) (!!(data.pgm_features & PGM_FEAT_TARGET_POWER)) +#define can_gen_hv_pulse(data) (!!(data.pgm_features & PGM_FEAT_HV_PULSE)) +#define can_do_ptg(data) (!!(data.pgm_features & PGM_FEAT_PTG)) + // Private data for this programmer struct pdata { - unsigned char pgm_type; // Used to skip unsupported functions + unsigned char pgm_features; // Bitmap of features unsigned char pk_op_mode; // See PK_OP_ defines unsigned char power_source; // 0: external / 1: from PICkit / 2: ignore check unsigned char hvupdi_enabled; // 0: no HV / 1: HV generation enabled @@ -282,7 +286,7 @@ static int pickit5_parseextparms(const PROGRAMMER *pgm, const LISTID extparms) { if(str_eq(extended_param, "help")) { msg_error("%s -c %s extended options:\n", progname, pgmid); msg_error(" -x vtarg= Enable power output; must be in [1.8, 5.5] V\n"); - msg_error(" -x hvupdi Enable high-voltage UPDI initialization\n"); + msg_error(" -x hvupdi Enable high-voltage UPDI initialization (if supported)\n"); msg_error(" -x help Show this help menu and exit\n"); return LIBAVRDUDE_EXIT; } @@ -620,11 +624,14 @@ static int pickit5_open(PROGRAMMER *pgm, const char *port) { my.pk_op_mode = PK_OP_FOUND; if(pinfo.usbinfo.pid == USB_DEVICE_PICKIT5) - my.pgm_type = PGM_TYPE_PK5; + my.pgm_features = PGM_FEAT_TARGET_POWER | PGM_FEAT_HV_PULSE | PGM_FEAT_PTG; else if(pinfo.usbinfo.pid == USB_DEVICE_PICKIT4_PIC_MODE) - my.pgm_type = PGM_TYPE_PK4; + my.pgm_features = PGM_FEAT_TARGET_POWER | PGM_FEAT_HV_PULSE | PGM_FEAT_PTG; else if(pinfo.usbinfo.pid == USB_DEVICE_SNAP_PIC_MODE) - my.pgm_type = PGM_TYPE_SNAP; + my.pgm_features = 0; + else if(pinfo.usbinfo.pid == USB_DEVICE_PICKIT_BASIC_PIC_MODE || + pinfo.usbinfo.pid == USB_DEVICE_PICKIT_BASIC_PIC_MODE_CDC) + my.pgm_features = 0; } // No PICkit4 / SNAP (PIC mode) nor PICkit5 found, look for programmer in AVR mode @@ -1000,11 +1007,12 @@ static int pickit5_program_enable(const PROGRAMMER *pgm, const AVRPART *p) { const unsigned char *enter_prog = my.scripts.EnterProgMode; unsigned int enter_prog_len = my.scripts.EnterProgMode_len; - if(my.hvupdi_enabled && (my.pgm_type != PGM_TYPE_SNAP)) { // SNAP has no HV generation + if(my.hvupdi_enabled && can_gen_hv_pulse(my)) { // SNAP and Basic have no HV generation if(p->hvupdi_variant == UPDI_ENABLE_HV_UPDI) { // High voltage generation on UPDI line enter_prog = my.scripts.EnterProgModeHvSp; enter_prog_len = my.scripts.EnterProgModeHvSp_len; - } else if(p->hvupdi_variant == UPDI_ENABLE_HV_RESET) { // High voltage generation on RST line + } else if(p->hvupdi_variant == UPDI_ENABLE_HV_RESET || // High voltage generation on RST line + p->hvupdi_variant == 3) { enter_prog = my.scripts.EnterProgModeHvSpRst; enter_prog_len = my.scripts.EnterProgModeHvSpRst_len; } @@ -1921,7 +1929,7 @@ static int pickit5_set_vtarget(const PROGRAMMER *pgm, double v) { 0x44 }; - if(my.pgm_type >= PGM_TYPE_SNAP) { // SNAP can't supply power, ignore + if(!can_power_target(my)) { // SNAP and Basic can't supply power, ignore return 0; } @@ -1974,8 +1982,8 @@ static int pickit5_get_vtarget(const PROGRAMMER *pgm, double *v) { } static int pickit5_set_ptg_mode(const PROGRAMMER *pgm) { - if(my.pgm_type >= PGM_TYPE_SNAP) // Don't bother if Programmer doesn't support PTG - return 0; // Note: Bitmask would be probably better in the future + if(!can_do_ptg(my)) // Don't bother if Programmer doesn't support PTG + return 0; unsigned char ptg_mode[] = { 0x5E, 0x00, 0x00, 0x00, 0x00, diff --git a/src/pickit5_lut_isp.c b/src/pickit5_lut_isp.c index 32567284..2837d07f 100644 --- a/src/pickit5_lut_isp.c +++ b/src/pickit5_lut_isp.c @@ -26,10 +26,10 @@ #include "pickit5_lut.h" -const unsigned char EnterProgMode_isp_0[44] = { - 0xac, 0x02, 0x00, 0x1e, 0x30, 0x90, 0x05, 0x00, 0x00, 0x53, 0xac, 0x9b, 0x06, 0x02, 0x9b, 0x07, - 0x00, 0x1e, 0x35, 0x05, 0x06, 0x07, 0x6c, 0x06, 0xfd, 0x53, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x1e, - 0x36, 0xa4, 0x1e, 0x31, 0x90, 0x01, 0xc0, 0x0e, 0x00, 0x00, 0x7f, 0x01, +const unsigned char EnterProgMode_isp_0[47] = { + 0x94, 0x32, 0x00, 0xac, 0x02, 0x00, 0x1e, 0x30, 0x90, 0x05, 0x00, 0x00, 0x53, 0xac, 0x9b, 0x06, + 0x02, 0x9b, 0x07, 0x00, 0x1e, 0x35, 0x05, 0x06, 0x07, 0x6c, 0x06, 0xfd, 0x53, 0x00, 0x00, 0x00, + 0x2f, 0x00, 0x1e, 0x36, 0xa4, 0x1e, 0x31, 0x90, 0x01, 0xc0, 0x0e, 0x00, 0x00, 0x7f, 0x01, }; const unsigned char ExitProgMode_isp_0[2] = { diff --git a/src/pickit5_lut_jtag.c b/src/pickit5_lut_jtag.c index f02f6bd8..94c11be3 100644 --- a/src/pickit5_lut_jtag.c +++ b/src/pickit5_lut_jtag.c @@ -26,12 +26,12 @@ #include "pickit5_lut.h" -const unsigned char EnterProgMode_jtag_0[70] = { - 0x9b, 0x00, 0x00, 0x1e, 0x60, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, 0x01, 0x04, 0x1e, - 0x62, 0x00, 0x01, 0x9b, 0x00, 0x00, 0x9b, 0x01, 0x01, 0x1e, 0x63, 0x00, 0x01, 0x9b, 0x00, 0x0c, - 0x1e, 0x66, 0x00, 0x90, 0x00, 0x01, 0x00, 0x00, 0x00, 0x9b, 0x01, 0x01, 0x1e, 0x67, 0x00, 0x01, - 0x94, 0x32, 0x00, 0x9b, 0x00, 0x04, 0x1e, 0x66, 0x00, 0x90, 0x00, 0x70, 0xa3, 0x00, 0x00, 0x9b, - 0x01, 0x10, 0x1e, 0x67, 0x00, 0x01, +const unsigned char EnterProgMode_jtag_0[73] = { + 0x94, 0x32, 0x00, 0x9b, 0x00, 0x00, 0x1e, 0x60, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9b, + 0x01, 0x04, 0x1e, 0x62, 0x00, 0x01, 0x9b, 0x00, 0x00, 0x9b, 0x01, 0x01, 0x1e, 0x63, 0x00, 0x01, + 0x9b, 0x00, 0x0c, 0x1e, 0x66, 0x00, 0x90, 0x00, 0x01, 0x00, 0x00, 0x00, 0x9b, 0x01, 0x01, 0x1e, + 0x67, 0x00, 0x01, 0x94, 0x32, 0x00, 0x9b, 0x00, 0x04, 0x1e, 0x66, 0x00, 0x90, 0x00, 0x70, 0xa3, + 0x00, 0x00, 0x9b, 0x01, 0x10, 0x1e, 0x67, 0x00, 0x01, }; const unsigned char EnterProgMode_jtag_1[179] = { diff --git a/src/pickit5_lut_updi.c b/src/pickit5_lut_updi.c index 24c744dd..1c185a05 100644 --- a/src/pickit5_lut_updi.c +++ b/src/pickit5_lut_updi.c @@ -1077,12 +1077,12 @@ const char * const pickit5_updi_chip_lut[] = { "AVR32DD20", "AVR32DD28", "AVR32DD32", "AVR64DA28", "AVR64DA32", "AVR64DA48", "AVR64DA64", "AVR64DB28", "AVR64DB32", "AVR64DB48", "AVR64DB64", "AVR64DD14", "AVR64DD20", "AVR64DD28", "AVR64DD32", "AVR64EA28", "AVR64EA32", "AVR64EA48", "AVR64DA28S", "AVR64DA32S", "AVR64DA48S", "AVR64DA64S", "AVR128DA28S", "AVR128DA32S", - "AVR128DA48S", "AVR128DA64S", "AVR16DA28", "AVR16DA32", "AVR16DA48", "AVR16DB28", "AVR16DB32", "AVR16DB48", - "AVR16DU14", "AVR16DU20", "AVR16DU28", "AVR16DU32", "AVR32DU14", "AVR32DU20", "AVR32DU28", "AVR32DU32", - "AVR64DU28", "AVR64DU32", "AVR16EA28", "AVR16EA32", "AVR16EA48", "AVR32EA28", "AVR32EA32", "AVR32EA48", - "AVR8EA28", "AVR8EA32", "AVR16EB14", "AVR16EB20", "AVR16EB28", "AVR16EB32", "AVR32EB28", "AVR32EB32", - "AVR32EB14", "AVR32EB20", "AVR32SD20", "AVR32SD28", "AVR32SD32", "AVR64SD28", "AVR64SD32", "AVR64SD48", - "AVR64EC28", "AVR64EC32", "AVR64EC48", + "AVR128DA48S", "AVR128DA64S", "AVR16DA28", "AVR16DA32", "AVR16DA48", "AVR32DA28S", "AVR32DA32S", "AVR32DA48S", + "AVR16DB28", "AVR16DB32", "AVR16DB48", "AVR16DU14", "AVR16DU20", "AVR16DU28", "AVR16DU32", "AVR32DU14", + "AVR32DU20", "AVR32DU28", "AVR32DU32", "AVR64DU28", "AVR64DU32", "AVR16EA28", "AVR16EA32", "AVR16EA48", + "AVR32EA28", "AVR32EA32", "AVR32EA48", "AVR8EA28", "AVR8EA32", "AVR16EB14", "AVR16EB20", "AVR16EB28", + "AVR16EB32", "AVR32EB28", "AVR32EB32", "AVR32EB14", "AVR32EB20", "AVR32SD20", "AVR32SD28", "AVR32SD32", + "AVR64SD28", "AVR64SD32", "AVR64SD48", "AVR64EC28", "AVR64EC32", "AVR64EC48", }; const unsigned char * get_devid_script_by_nvm_ver(unsigned char version) { @@ -1099,7 +1099,7 @@ int get_pickit_updi_script(SCRIPT *scr, const char* partdesc) { return -1; } int namepos = -1; - for (int i = 0; i < 131; i++) { + for (int i = 0; i < 134; i++) { if (strcmp(pickit5_updi_chip_lut[i], partdesc) == 0) { namepos = i; break; @@ -1271,9 +1271,12 @@ int get_pickit_updi_script(SCRIPT *scr, const char* partdesc) { case 90: /* AVR16DA28 */ case 91: /* AVR16DA32 */ case 92: /* AVR16DA48 */ - case 93: /* AVR16DB28 */ - case 94: /* AVR16DB32 */ - case 95: /* AVR16DB48 */ + case 93: /* AVR32DA28S */ + case 94: /* AVR32DA32S */ + case 95: /* AVR32DA48S */ + case 96: /* AVR16DB28 */ + case 97: /* AVR16DB32 */ + case 98: /* AVR16DB48 */ scr->GetDeviceID = GetDeviceID_updi_0; scr->GetDeviceID_len = sizeof(GetDeviceID_updi_0); scr->EraseChip = EraseChip_updi_1; @@ -1323,16 +1326,16 @@ int get_pickit_updi_script(SCRIPT *scr, const char* partdesc) { scr->ReadIDmem = ReadIDmem_updi_1; scr->ReadIDmem_len = sizeof(ReadIDmem_updi_1); break; - case 96: /* AVR16DU14 */ - case 97: /* AVR16DU20 */ - case 98: /* AVR16DU28 */ - case 99: /* AVR16DU32 */ - case 100: /* AVR32DU14 */ - case 101: /* AVR32DU20 */ - case 102: /* AVR32DU28 */ - case 103: /* AVR32DU32 */ - case 104: /* AVR64DU28 */ - case 105: /* AVR64DU32 */ + case 99: /* AVR16DU14 */ + case 100: /* AVR16DU20 */ + case 101: /* AVR16DU28 */ + case 102: /* AVR16DU32 */ + case 103: /* AVR32DU14 */ + case 104: /* AVR32DU20 */ + case 105: /* AVR32DU28 */ + case 106: /* AVR32DU32 */ + case 107: /* AVR64DU28 */ + case 108: /* AVR64DU32 */ scr->GetDeviceID = GetDeviceID_updi_1; scr->GetDeviceID_len = sizeof(GetDeviceID_updi_1); scr->EraseChip = EraseChip_updi_3; @@ -1356,14 +1359,14 @@ int get_pickit_updi_script(SCRIPT *scr, const char* partdesc) { scr->ReadIDmem = ReadIDmem_updi_2; scr->ReadIDmem_len = sizeof(ReadIDmem_updi_2); break; - case 106: /* AVR16EA28 */ - case 107: /* AVR16EA32 */ - case 108: /* AVR16EA48 */ - case 109: /* AVR32EA28 */ - case 110: /* AVR32EA32 */ - case 111: /* AVR32EA48 */ - case 112: /* AVR8EA28 */ - case 113: /* AVR8EA32 */ + case 109: /* AVR16EA28 */ + case 110: /* AVR16EA32 */ + case 111: /* AVR16EA48 */ + case 112: /* AVR32EA28 */ + case 113: /* AVR32EA32 */ + case 114: /* AVR32EA48 */ + case 115: /* AVR8EA28 */ + case 116: /* AVR8EA32 */ scr->GetDeviceID = GetDeviceID_updi_0; scr->GetDeviceID_len = sizeof(GetDeviceID_updi_0); scr->EraseChip = EraseChip_updi_2; @@ -1387,14 +1390,14 @@ int get_pickit_updi_script(SCRIPT *scr, const char* partdesc) { scr->ReadIDmem = ReadIDmem_updi_1; scr->ReadIDmem_len = sizeof(ReadIDmem_updi_1); break; - case 114: /* AVR16EB14 */ - case 115: /* AVR16EB20 */ - case 116: /* AVR16EB28 */ - case 117: /* AVR16EB32 */ - case 118: /* AVR32EB28 */ - case 119: /* AVR32EB32 */ - case 120: /* AVR32EB14 */ - case 121: /* AVR32EB20 */ + case 117: /* AVR16EB14 */ + case 118: /* AVR16EB20 */ + case 119: /* AVR16EB28 */ + case 120: /* AVR16EB32 */ + case 121: /* AVR32EB28 */ + case 122: /* AVR32EB32 */ + case 123: /* AVR32EB14 */ + case 124: /* AVR32EB20 */ scr->GetDeviceID = GetDeviceID_updi_1; scr->GetDeviceID_len = sizeof(GetDeviceID_updi_1); scr->EraseChip = EraseChip_updi_2; @@ -1418,12 +1421,12 @@ int get_pickit_updi_script(SCRIPT *scr, const char* partdesc) { scr->ReadIDmem = ReadIDmem_updi_1; scr->ReadIDmem_len = sizeof(ReadIDmem_updi_1); break; - case 122: /* AVR32SD20 */ - case 123: /* AVR32SD28 */ - case 124: /* AVR32SD32 */ - case 125: /* AVR64SD28 */ - case 126: /* AVR64SD32 */ - case 127: /* AVR64SD48 */ + case 125: /* AVR32SD20 */ + case 126: /* AVR32SD28 */ + case 127: /* AVR32SD32 */ + case 128: /* AVR64SD28 */ + case 129: /* AVR64SD32 */ + case 130: /* AVR64SD48 */ scr->GetDeviceID = GetDeviceID_updi_1; scr->GetDeviceID_len = sizeof(GetDeviceID_updi_1); scr->EraseChip = EraseChip_updi_4; @@ -1447,9 +1450,9 @@ int get_pickit_updi_script(SCRIPT *scr, const char* partdesc) { scr->ReadIDmem = ReadIDmem_updi_2; scr->ReadIDmem_len = sizeof(ReadIDmem_updi_2); break; - case 128: /* AVR64EC28 */ - case 129: /* AVR64EC32 */ - case 130: /* AVR64EC48 */ + case 131: /* AVR64EC28 */ + case 132: /* AVR64EC32 */ + case 133: /* AVR64EC48 */ scr->GetDeviceID = GetDeviceID_updi_1; scr->GetDeviceID_len = sizeof(GetDeviceID_updi_1); scr->EraseChip = EraseChip_updi_2; diff --git a/src/usbdevs.h b/src/usbdevs.h index 3652eb22..46d73a58 100644 --- a/src/usbdevs.h +++ b/src/usbdevs.h @@ -21,27 +21,29 @@ #ifndef usbdevs_h #define usbdevs_h -#define USB_VENDOR_ATMEL 0x03EB -#define USB_VENDOR_MICROCHIP 0x04D8 +#define USB_VENDOR_ATMEL 0x03EB +#define USB_VENDOR_MICROCHIP 0x04D8 -#define USB_DEVICE_JTAGICEMKII 0x2103 -#define USB_DEVICE_AVRISPMKII 0x2104 -#define USB_DEVICE_STK600 0x2106 -#define USB_DEVICE_AVRDRAGON 0x2107 -#define USB_DEVICE_JTAGICE3 0x2110 -#define USB_DEVICE_XPLAINEDPRO 0x2111 -#define USB_DEVICE_JTAG3_EDBG 0x2140 -#define USB_DEVICE_ATMEL_ICE 0x2141 -#define USB_DEVICE_POWERDEBUGGER 0x2144 -#define USB_DEVICE_XPLAINEDMINI 0x2145 -#define USB_DEVICE_PKOBN 0x2175 -#define USB_DEVICE_PICKIT4_AVR_MODE 0x2177 -#define USB_DEVICE_PICKIT4_PIC_MODE 0x9012 -#define USB_DEVICE_PICKIT4_PIC_MODE_BL 0x9017 // PICkit4 in bootloader mode -#define USB_DEVICE_PICKIT5 0x9036 -#define USB_DEVICE_SNAP_AVR_MODE 0x2180 -#define USB_DEVICE_SNAP_PIC_MODE 0x9018 -#define USB_DEVICE_SNAP_PIC_MODE_BL 0x9019 // SNAP in bootloader mode +#define USB_DEVICE_JTAGICEMKII 0x2103 +#define USB_DEVICE_AVRISPMKII 0x2104 +#define USB_DEVICE_STK600 0x2106 +#define USB_DEVICE_AVRDRAGON 0x2107 +#define USB_DEVICE_JTAGICE3 0x2110 +#define USB_DEVICE_XPLAINEDPRO 0x2111 +#define USB_DEVICE_JTAG3_EDBG 0x2140 +#define USB_DEVICE_ATMEL_ICE 0x2141 +#define USB_DEVICE_POWERDEBUGGER 0x2144 +#define USB_DEVICE_XPLAINEDMINI 0x2145 +#define USB_DEVICE_PKOBN 0x2175 +#define USB_DEVICE_PICKIT4_AVR_MODE 0x2177 +#define USB_DEVICE_PICKIT4_PIC_MODE 0x9012 +#define USB_DEVICE_PICKIT4_PIC_MODE_BL 0x9017 // PICkit4 in bootloader mode +#define USB_DEVICE_PICKIT5 0x9036 +#define USB_DEVICE_SNAP_AVR_MODE 0x2180 +#define USB_DEVICE_SNAP_PIC_MODE 0x9018 +#define USB_DEVICE_SNAP_PIC_MODE_BL 0x9019 // SNAP in bootloader mode +#define USB_DEVICE_PICKIT_BASIC_PIC_MODE 0x9054 // PICkit Basic (app, vendor) +#define USB_DEVICE_PICKIT_BASIC_PIC_MODE_CDC 0x9055 // PICkit Basic (app, vendor + CDC) #define USB_VENDOR_FTDI 0x0403 #define USB_DEVICE_FT2232 0x6010