Skip to content

Commit

Permalink
Merge pull request #1468 from stefanrueger/stk500
Browse files Browse the repository at this point in the history
Fix probing of the generic -c stk500 programmer
  • Loading branch information
stefanrueger committed Aug 4, 2023
2 parents 0c2f2e6 + ca3144b commit 70190be
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 49 deletions.
2 changes: 1 addition & 1 deletion src/avrdude.conf.in
Original file line number Diff line number Diff line change
Expand Up @@ -1418,7 +1418,7 @@ programmer

programmer
id = "stk500";
desc = "Atmel STK500";
desc = "Atmel STK500 (probes STK500v2 first then STK500v1)";
type = "stk500generic";
prog_modes = PM_ISP;
extra_features = HAS_VTARG_ADJ | HAS_VTARG_READ | HAS_FOSC_ADJ | HAS_VAREF_ADJ;
Expand Down
1 change: 1 addition & 0 deletions src/stk500.c
Original file line number Diff line number Diff line change
Expand Up @@ -1454,6 +1454,7 @@ static void stk500_setup(PROGRAMMER * pgm)
static void stk500_teardown(PROGRAMMER * pgm)
{
free(pgm->cookie);
pgm->cookie = NULL;
}

const char stk500_desc[] = "Atmel STK500 Version 1.x firmware";
Expand Down
64 changes: 32 additions & 32 deletions src/stk500generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,15 @@
* This is a wrapper around the STK500[v1] and STK500v2 programmers.
* Try to select the programmer type that actually responds, and
* divert to the actual programmer implementation if successful.
* Using -c stk500 instead of the appropriate -c stk500v1 or -c stk500v2
* misses out on the extended -x options of the successful programmer.
*/

#include "ac_cfg.h"

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "avrdude.h"
#include "libavrdude.h"
Expand All @@ -38,40 +41,39 @@
#include "stk500.h"
#include "stk500v2.h"

static int stk500generic_open(PROGRAMMER *pgm, const char *port) {
stk500_initpgm(pgm);
if (pgm->open(pgm, port) >= 0)
{
pmsg_info("successfully opened stk500v1 device -- please use -c stk500v1\n");
return 0;
}

pgm->close(pgm);

stk500v2_initpgm(pgm);
if (pgm->open(pgm, port) >= 0)
{
pmsg_info("successfully opened stk500v2 device -- please use -c stk500v2\n");
return 0;
}

pmsg_error("cannot open either stk500v1 or stk500v2 programmer\n");
return -1;
static PROGRAMMER *stk500vn;
static void stk500vn_exithook(void) {
if(stk500vn && stk500vn->teardown)
stk500vn->teardown(stk500vn);
}

static void stk500generic_setup(PROGRAMMER * pgm)
{
/*
* Only STK500v2 needs setup/teardown.
*/
static int stk500generic_open(PROGRAMMER *pgm, const char *port) {
stk500v2_initpgm(pgm);
pgm->setup(pgm);
}
if(pgm->setup)
pgm->setup(pgm);
if(pgm->open(pgm, port) >= 0) {
stk500vn = pgm;
atexit(stk500vn_exithook);
pmsg_info("successfully opened stk500v2 device; please use -c stk500v2\n");
return 0;
}
if(pgm->teardown)
pgm->teardown(pgm);

static void stk500generic_teardown(PROGRAMMER * pgm)
{
stk500v2_initpgm(pgm);
pgm->teardown(pgm);
stk500_initpgm(pgm);
if(pgm->setup)
pgm->setup(pgm);
if(pgm->open(pgm, port) >= 0) {
stk500vn = pgm;
atexit(stk500vn_exithook);
pmsg_info("successfully opened stk500v1 device; please use -c stk500v1\n");
return 0;
}
if(pgm->teardown)
pgm->teardown(pgm);

pmsg_error("probing stk500v2 failed, as did stk500v1; perhaps try -c stk500v1\n");
return -1;
}

const char stk500generic_desc[] = "Atmel STK500, autodetect firmware version";
Expand All @@ -80,6 +82,4 @@ void stk500generic_initpgm(PROGRAMMER *pgm) {
strcpy(pgm->type, "STK500GENERIC");

pgm->open = stk500generic_open;
pgm->setup = stk500generic_setup;
pgm->teardown = stk500generic_teardown;
}
23 changes: 7 additions & 16 deletions src/stk500v2.c
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,7 @@ static void stk500v2_jtag3_setup(PROGRAMMER * pgm)
void stk500v2_teardown(PROGRAMMER * pgm)
{
free(pgm->cookie);
pgm->cookie = NULL;
}

static void stk500v2_jtagmkII_teardown(PROGRAMMER * pgm)
Expand Down Expand Up @@ -2123,14 +2124,9 @@ static int stk500v2_open(PROGRAMMER *pgm, const char *port) {
if (serdev && serdev->usbsn)
pgm->usbsn = serdev->usbsn;

/*
* drain any extraneous input
*/
stk500v2_drain(pgm, 0);

stk500v2_getsync(pgm);

stk500v2_drain(pgm, 0);
// Drain any extraneous input, synchronise and drain again
if(stk500v2_drain(pgm, 0) < 0 || stk500v2_getsync(pgm) < 0 || stk500v2_drain(pgm, 0) < 0)
return -1;

if (pgm->bitclock != 0.0) {
if (pgm->set_sck_period(pgm, pgm->bitclock) != 0)
Expand Down Expand Up @@ -2180,14 +2176,9 @@ static int stk600_open(PROGRAMMER *pgm, const char *port) {
return -1;
}

/*
* drain any extraneous input
*/
stk500v2_drain(pgm, 0);

stk500v2_getsync(pgm);

stk500v2_drain(pgm, 0);
// Drain any extraneous input, synchronise and drain again
if(stk500v2_drain(pgm, 0) < 0 || stk500v2_getsync(pgm) < 0 || stk500v2_drain(pgm, 0) < 0)
return -1;

if (pgm->bitclock != 0.0) {
if (pgm->set_sck_period(pgm, pgm->bitclock) != 0)
Expand Down

0 comments on commit 70190be

Please sign in to comment.