Skip to content

Commit 59ec3f1

Browse files
committed
Fix PICkit4/Snap mode= processing and documetation
1 parent d430809 commit 59ec3f1

File tree

3 files changed

+63
-39
lines changed

3 files changed

+63
-39
lines changed

src/avrdude.1

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1665,15 +1665,18 @@ Show help menu and exit.
16651665
.It Ar PICkit 4
16661666
.It Ar MPLAB SNAP
16671667
.Bl -tag -offset indent -width indent
1668-
.It Ar mode=avr,pic
1669-
Switch programmer to AVR or PIC mode, then exit: the PICkit 4 and MPLAB SNAP
1670-
programmer can only be utilised by
1668+
.It Ar mode=avr
1669+
Switch programmer to AVR mode, then exit if not already in AVR mode
1670+
.It Ar mode=<mplab|pic>
1671+
Switch programmer to MPLAB aka PIC mode, then exit
1672+
.Pp
1673+
The PICkit 4 and MPLAB SNAP programmer can only be utilised by
16711674
.Nm
16721675
when in AVR mode. Use
16731676
.Ar -x mode=avr
16741677
for switching to AVR mode, or
1675-
.Ar -x mode=pic
1676-
for switching to PIC mode.
1678+
.Ar -x mode=mplab
1679+
for switching (back) to MPLAB mode.
16771680
.It Ar help
16781681
Show help menu and exit.
16791682
.El

src/doc/avrdude.texi

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1422,13 +1422,16 @@ The current set-voltage can be read by @code{-x vtarg} alone.
14221422

14231423
The PICkit 4 and MPLAB(R) SNAP programmers accept the following extended parameters:
14241424
@table @code
1425-
@item mode=avr,mplab/pic
1426-
Switch programmer to AVR or MPLAB mode, then exit: the PICkit 4 and MPLAB(R) SNAP
1427-
programmer can only be utilised by Avrdude when in AVR mode.
1428-
Use @code{-x mode=avr} for switching to AVR mode, or @code{-x mode=mplab}
1429-
for switching to MPLAB mode.
1425+
@item mode=avr
1426+
Switch programmer to AVR mode, then exit unless it was already in AVR mode
1427+
@item mode=<mplab|pic>
1428+
Switch programmer to MPLAB aka PIC mode, then exit
14301429
@end table
14311430

1431+
The PICkit 4 and MPLAB(R) SNAP programmer can only be utilised by AVRDUDE
1432+
when in AVR mode. Use @code{-x mode=avr} for switching to AVR mode, or
1433+
@code{-x mode=mplab} for switching (back) to MPLAB mode.
1434+
14321435
@cindex Option @code{-x} PICkit 5
14331436
@cindex @code{-x} PICkit 5
14341437
@cindex MPLAB(R) PICkit 4

src/jtag3.c

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1606,25 +1606,27 @@ static int jtag3_parseextparms(const PROGRAMMER *pgm, const LISTID extparms) {
16061606
msg_error("%s -c %s extended options:\n", progname, pgmid);
16071607
if(str_eq(pgm->type, "JTAGICE3")) {
16081608
msg_error(" -x jtagchain=UB,UA,BB,BA Setup the JTAG scan chain order\n");
1609-
msg_error(" UB/UA = units before/after, BB/BA = bits before/after\n");
1609+
msg_error(" UB/UA = units before/after, BB/BA = bits before/after\n");
16101610
}
16111611
if(lsize(pgm->hvupdi_support) > 1)
1612-
msg_error(" -x hvupdi Enable high-voltage UPDI initialization\n");
1612+
msg_error(" -x hvupdi Enable high-voltage UPDI initialization\n");
16131613
if(pgm->extra_features & HAS_SUFFER) {
1614-
msg_error(" -x suffer Read SUFFER register value\n");
1615-
msg_error(" -x suffer=<n> Set SUFFER register to <n> (0x.. hex, 0.. oct or dec)\n");
1614+
msg_error(" -x suffer Read SUFFER register value\n");
1615+
msg_error(" -x suffer=<n> Set SUFFER register to <n> (0x.. hex, 0.. oct or dec)\n");
16161616
}
16171617
if(pgm->extra_features & HAS_VTARG_SWITCH) {
1618-
msg_error(" -x vtarg_switch Read on-board target voltage switch state\n");
1619-
msg_error(" -x vtarg_switch=<0..1> Set on-board target voltage switch state\n");
1618+
msg_error(" -x vtarg_switch Read on-board target voltage switch state\n");
1619+
msg_error(" -x vtarg_switch=<0|1> Set on-board target voltage switch state\n");
16201620
}
16211621
if(pgm->extra_features & HAS_VTARG_ADJ) {
1622-
msg_error(" -x vtarg Read on-board target supply voltage\n");
1623-
msg_error(" -x vtarg=<dbl> Set on-board target supply voltage to <dbl> V\n");
1622+
msg_error(" -x vtarg Read on-board target supply voltage\n");
1623+
msg_error(" -x vtarg=<dbl> Set on-board target supply voltage to <dbl> V\n");
16241624
}
1625-
if(str_starts(pgmid, "pickit4") || str_starts(pgmid, "snap"))
1626-
msg_error(" -x mode=avr|[pic|mplab] Set programmer to AVR or MPLAB (PIC) mode, then exit\n");
1627-
msg_error(" -x help Show this help menu and exit\n");
1625+
if(str_starts(pgmid, "pickit4") || str_starts(pgmid, "snap")) {
1626+
msg_error(" -x mode=avr Set programmer to AVR mode and exit if it was not\n");
1627+
msg_error(" -x mode=<mplab|pic> Set programmer to MPLAB aka PIC mode and exit\n");
1628+
}
1629+
msg_error(" -x help Show this help menu and exit\n");
16281630
return rv;
16291631
}
16301632

@@ -1713,31 +1715,48 @@ int jtag3_open_common(PROGRAMMER *pgm, const char *port, int mode_switch) {
17131715
pic_mode = serial_open(port, pinfo, &pgm->fd);
17141716
}
17151717
if(pic_mode >= 0) {
1716-
msg_error("\n");
1718+
const char *partsdesc_flag = partdesc? " -p ": "";
1719+
const char *partsdesc_str = partdesc? partdesc: "";
1720+
const char *pgm_suffix = strchr(pgmid, '_')? strchr(pgmid, '_'): "";
1721+
17171722
cx->usb_access_error = 0;
1718-
pmsg_error("%s in %s mode detected\n", pgmstr, pinfo.usbinfo.pid == bl_pid? "bootloader": "mplab");
1719-
if(mode_switch == PK4_SNAP_MODE_AVR) {
1720-
imsg_error("switching to AVR mode; ");
1723+
1724+
switch(mode_switch) {
1725+
case PK4_SNAP_MODE_AVR:
1726+
msg_info("\n");
1727+
pmsg_info("%s in %s mode detected\n", pgmstr,
1728+
pinfo.usbinfo.pid == bl_pid? "bootloader": "mplab");
1729+
pmsg_info("switching to AVR mode; ");
17211730
if(pinfo.usbinfo.pid == bl_pid)
17221731
serial_send(&pgm->fd, exit_bl_cmd, sizeof(exit_bl_cmd));
17231732
else {
17241733
serial_send(&pgm->fd, enter_avr_mode_cmd, sizeof(enter_avr_mode_cmd));
17251734
usleep(250*1000);
17261735
serial_send(&pgm->fd, reset_cmd, sizeof(reset_cmd));
17271736
}
1728-
imsg_error("run %s again to continue the session\n\n", progname);
1729-
} else {
1730-
1731-
const char *partsdesc_flag = partdesc? " -p ": "";
1732-
const char *partsdesc_str = partdesc? partdesc: "";
1733-
const char *pgm_suffix = strchr(pgmid, '_')? strchr(pgmid, '_'): "";
1737+
imsg_info("run %s again to continue the session\n", progname);
1738+
serial_close(&pgm->fd);
1739+
return LIBAVRDUDE_EXIT_OK;
1740+
1741+
case PK4_SNAP_MODE_PIC:
1742+
pmsg_info("%s in %s mode detected; exiting\n", pgmstr,
1743+
pinfo.usbinfo.pid == bl_pid? "bootloader": "mplab");
1744+
serial_close(&pgm->fd);
1745+
return LIBAVRDUDE_EXIT_OK;
1746+
1747+
default:
1748+
msg_error("\n");
1749+
pmsg_error("%s in %s mode detected\n", pgmstr,
1750+
pinfo.usbinfo.pid == bl_pid? "bootloader": "mplab");
17341751
imsg_error("to switch into AVR mode try\n");
1735-
imsg_error("$ %s -c %s%s%s -P %s -x mode=avr\n\n", progname, pgmid, partsdesc_flag, partsdesc_str, port);
1736-
imsg_error("or use MPLAB mode by using the pickit4_mplab%s programmer option:\n", pgm_suffix);
1737-
imsg_error("$ %s -c pickit4_mplab%s%s%s -P %s\n", progname, pgm_suffix, partsdesc_flag, partsdesc_str, port);
1752+
imsg_error("$ %s -c %s%s%s -P %s -x mode=avr\n\n", progname,
1753+
pgmid, partsdesc_flag, partsdesc_str, port);
1754+
imsg_error("or use MPLAB mode with the pickit4_mplab%s programmer:\n", pgm_suffix);
1755+
imsg_error("$ %s -c pickit4_mplab%s%s%s -P %s\n", progname,
1756+
pgm_suffix, partsdesc_flag, partsdesc_str, port);
1757+
serial_close(&pgm->fd);
1758+
return LIBAVRDUDE_EXIT_FAIL;
17381759
}
1739-
serial_close(&pgm->fd);
1740-
return LIBAVRDUDE_EXIT_FAIL;
17411760
}
17421761
}
17431762
}
@@ -1778,13 +1797,12 @@ int jtag3_open_common(PROGRAMMER *pgm, const char *port, int mode_switch) {
17781797

17791798
// Switch from AVR to PIC mode
17801799
if(mode_switch == PK4_SNAP_MODE_PIC) {
1781-
imsg_error("switching to MPLAB mode: ");
17821800
unsigned char *resp, buf[] = { SCOPE_GENERAL, CMD3_FW_UPGRADE, 0x00, 0x00, 0x70, 0x6d, 0x6a };
17831801
if(jtag3_command(pgm, buf, sizeof(buf), &resp, "enter MPLAB mode") < 0) {
1784-
msg_error("entering MPLAB mode failed\n");
1802+
pmsg_error("switching to MPLAB mode failed\n");
17851803
return -1;
17861804
}
1787-
msg_error("MPLAB mode switch successful\n");
1805+
msg_info("switched successfully to MPLAB mode\n");
17881806
serial_close(&pgm->fd);
17891807
return LIBAVRDUDE_EXIT_OK;
17901808
}

0 commit comments

Comments
 (0)