Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
jtagmkII.c File Reference
#include "ac_cfg.h"
#include <ctype.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h>
#include <time.h>
#include "avrdude.h"
#include "libavrdude.h"
#include "crc16.h"
#include "jtagmkII.h"
#include "jtagmkII_private.h"
#include "usbdevs.h"
+ Include dependency graph for jtagmkII.c:

Go to the source code of this file.

Classes

struct  pdata
 

Macros

#define PDATA(pgm)   ((struct pdata *)(pgm->cookie))
 
#define OCDEN   (1 << 7)
 
#define RC(x)   { x, #x },
 
#define PGM_FL_IS_DW   (0x0001)
 
#define PGM_FL_IS_PDI   (0x0002)
 
#define PGM_FL_IS_JTAG   (0x0004)
 
#define ERROR_SAB   0xFFFFFFFF
 
#define MAXTRIES   33
 
#define FWVER(maj, min)   ((maj << 8) | (min))
 

Functions

static int jtagmkII_open (PROGRAMMER *pgm, char *port)
 
static int jtagmkII_initialize (PROGRAMMER *pgm, AVRPART *p)
 
static int jtagmkII_chip_erase (PROGRAMMER *pgm, AVRPART *p)
 
static int jtagmkII_read_byte (PROGRAMMER *pgm, AVRPART *p, AVRMEM *mem, unsigned long addr, unsigned char *value)
 
static int jtagmkII_write_byte (PROGRAMMER *pgm, AVRPART *p, AVRMEM *mem, unsigned long addr, unsigned char data)
 
static int jtagmkII_reset (PROGRAMMER *pgm, unsigned char flags)
 
static int jtagmkII_set_sck_period (PROGRAMMER *pgm, double v)
 
static int jtagmkII_setparm (PROGRAMMER *pgm, unsigned char parm, unsigned char *value)
 
static void jtagmkII_print_parms1 (PROGRAMMER *pgm, const char *p)
 
static int jtagmkII_paged_write (PROGRAMMER *pgm, AVRPART *p, AVRMEM *m, unsigned int page_size, unsigned int addr, unsigned int n_bytes)
 
static unsigned char jtagmkII_memtype (PROGRAMMER *pgm, AVRPART *p, unsigned long addr)
 
static unsigned int jtagmkII_memaddr (PROGRAMMER *pgm, AVRPART *p, AVRMEM *m, unsigned long addr)
 
static int jtagmkII_open32 (PROGRAMMER *pgm, char *port)
 
static void jtagmkII_close32 (PROGRAMMER *pgm)
 
static int jtagmkII_reset32 (PROGRAMMER *pgm, unsigned short flags)
 
static int jtagmkII_initialize32 (PROGRAMMER *pgm, AVRPART *p)
 
static int jtagmkII_chip_erase32 (PROGRAMMER *pgm, AVRPART *p)
 
static unsigned long jtagmkII_read_SABaddr (PROGRAMMER *pgm, unsigned long addr, unsigned int prefix)
 
static int jtagmkII_write_SABaddr (PROGRAMMER *pgm, unsigned long addr, unsigned int prefix, unsigned long val)
 
static int jtagmkII_avr32_reset (PROGRAMMER *pgm, unsigned char val, unsigned char ret1, unsigned char ret2)
 
static int jtagmkII_smc_init32 (PROGRAMMER *pgm)
 
static int jtagmkII_paged_write32 (PROGRAMMER *pgm, AVRPART *p, AVRMEM *m, unsigned int page_size, unsigned int addr, unsigned int n_bytes)
 
static int jtagmkII_flash_lock32 (PROGRAMMER *pgm, unsigned char lock, unsigned int page)
 
static int jtagmkII_flash_erase32 (PROGRAMMER *pgm, unsigned int page)
 
static int jtagmkII_flash_write_page32 (PROGRAMMER *pgm, unsigned int page)
 
static int jtagmkII_flash_clear_pagebuffer32 (PROGRAMMER *pgm)
 
static int jtagmkII_paged_load32 (PROGRAMMER *pgm, AVRPART *p, AVRMEM *m, unsigned int page_size, unsigned int addr, unsigned int n_bytes)
 
void jtagmkII_setup (PROGRAMMER *pgm)
 
void jtagmkII_teardown (PROGRAMMER *pgm)
 
static unsigned long b4_to_u32 (unsigned char *b)
 
static unsigned long b4_to_u32r (unsigned char *b)
 
static void u32_to_b4 (unsigned char *b, unsigned long l)
 
static void u32_to_b4r (unsigned char *b, unsigned long l)
 
static unsigned short b2_to_u16 (unsigned char *b)
 
static void u16_to_b2 (unsigned char *b, unsigned short l)
 
static const char * jtagmkII_get_rc (unsigned int rc)
 
static void jtagmkII_print_memory (unsigned char *b, size_t s)
 
static void jtagmkII_prmsg (PROGRAMMER *pgm, unsigned char *data, size_t len)
 
int jtagmkII_send (PROGRAMMER *pgm, unsigned char *data, size_t len)
 
static int jtagmkII_drain (PROGRAMMER *pgm, int display)
 
static int jtagmkII_recv_frame (PROGRAMMER *pgm, unsigned char **msg, unsigned short *seqno)
 
int jtagmkII_recv (PROGRAMMER *pgm, unsigned char **msg)
 
int jtagmkII_getsync (PROGRAMMER *pgm, int mode)
 
static int jtagmkII_chip_erase_dw (PROGRAMMER *pgm, AVRPART *p)
 
static void jtagmkII_set_devdescr (PROGRAMMER *pgm, AVRPART *p)
 
static void jtagmkII_set_xmega_params (PROGRAMMER *pgm, AVRPART *p)
 
static int jtagmkII_program_enable_INFO (PROGRAMMER *pgm, AVRPART *p)
 
static int jtagmkII_program_enable (PROGRAMMER *pgm)
 
static int jtagmkII_program_disable (PROGRAMMER *pgm)
 
static unsigned char jtagmkII_get_baud (long baud)
 
static void jtagmkII_disable (PROGRAMMER *pgm)
 
static void jtagmkII_enable (PROGRAMMER *pgm)
 
static int jtagmkII_parseextparms (PROGRAMMER *pgm, LISTID extparms)
 
static int jtagmkII_open_dw (PROGRAMMER *pgm, char *port)
 
static int jtagmkII_open_pdi (PROGRAMMER *pgm, char *port)
 
static int jtagmkII_dragon_open (PROGRAMMER *pgm, char *port)
 
static int jtagmkII_dragon_open_dw (PROGRAMMER *pgm, char *port)
 
static int jtagmkII_dragon_open_pdi (PROGRAMMER *pgm, char *port)
 
void jtagmkII_close (PROGRAMMER *pgm)
 
static int jtagmkII_page_erase (PROGRAMMER *pgm, AVRPART *p, AVRMEM *m, unsigned int addr)
 
static int jtagmkII_paged_load (PROGRAMMER *pgm, AVRPART *p, AVRMEM *m, unsigned int page_size, unsigned int addr, unsigned int n_bytes)
 
int jtagmkII_getparm (PROGRAMMER *pgm, unsigned char parm, unsigned char *value)
 
static void jtagmkII_display (PROGRAMMER *pgm, const char *p)
 
static void jtagmkII_print_parms (PROGRAMMER *pgm)
 
void jtagmkII_initpgm (PROGRAMMER *pgm)
 
void jtagmkII_dw_initpgm (PROGRAMMER *pgm)
 
void jtagmkII_pdi_initpgm (PROGRAMMER *pgm)
 
void jtagmkII_dragon_initpgm (PROGRAMMER *pgm)
 
void jtagmkII_dragon_dw_initpgm (PROGRAMMER *pgm)
 
void jtagmkII_avr32_initpgm (PROGRAMMER *pgm)
 
void jtagmkII_dragon_pdi_initpgm (PROGRAMMER *pgm)
 

Variables

struct { 
 
unsigned int code
 
const char * descr
 
jtagresults [] 
 
const char jtagmkII_desc [] = "Atmel JTAG ICE mkII"
 
const char jtagmkII_dw_desc [] = "Atmel JTAG ICE mkII in debugWire mode"
 
const char jtagmkII_pdi_desc [] = "Atmel JTAG ICE mkII in PDI mode"
 
const char jtagmkII_dragon_desc [] = "Atmel AVR Dragon in JTAG mode"
 
const char jtagmkII_dragon_dw_desc [] = "Atmel AVR Dragon in debugWire mode"
 
const char jtagmkII_avr32_desc [] = "Atmel JTAG ICE mkII in AVR32 mode"
 
const char jtagmkII_dragon_pdi_desc [] = "Atmel AVR Dragon in PDI mode"
 

Macro Definition Documentation

◆ ERROR_SAB

#define ERROR_SAB   0xFFFFFFFF

◆ FWVER

#define FWVER (   maj,
  min 
)    ((maj << 8) | (min))

◆ MAXTRIES

#define MAXTRIES   33

◆ OCDEN

#define OCDEN   (1 << 7)

◆ PDATA

#define PDATA (   pgm)    ((struct pdata *)(pgm->cookie))

◆ PGM_FL_IS_DW

#define PGM_FL_IS_DW   (0x0001)

◆ PGM_FL_IS_JTAG

#define PGM_FL_IS_JTAG   (0x0004)

◆ PGM_FL_IS_PDI

#define PGM_FL_IS_PDI   (0x0002)

◆ RC

#define RC (   x)    { x, #x },

Function Documentation

◆ b2_to_u16()

static unsigned short b2_to_u16 ( unsigned char *  b)
static
234{
235 unsigned short l;
236 l = b[0];
237 l += (unsigned)b[1] << 8;
238
239 return l;
240}

Referenced by jtagmkII_print_parms1().

+ Here is the caller graph for this function:

◆ b4_to_u32()

static unsigned long b4_to_u32 ( unsigned char *  b)
static
194{
195 unsigned long l;
196 l = b[0];
197 l += (unsigned)b[1] << 8;
198 l += (unsigned)b[2] << 16;
199 l += (unsigned)b[3] << 24;
200
201 return l;
202}

Referenced by jtagmkII_prmsg().

+ Here is the caller graph for this function:

◆ b4_to_u32r()

static unsigned long b4_to_u32r ( unsigned char *  b)
static
205{
206 unsigned long l;
207 l = b[3];
208 l += (unsigned)b[2] << 8;
209 l += (unsigned)b[1] << 16;
210 l += (unsigned)b[0] << 24;
211
212 return l;
213}

Referenced by jtagmkII_read_SABaddr().

+ Here is the caller graph for this function:

◆ jtagmkII_avr32_initpgm()

void jtagmkII_avr32_initpgm ( PROGRAMMER pgm)
3974{
3975 strcpy(pgm->type, "JTAGMKII_AVR32");
3976
3977 /*
3978 * mandatory functions
3979 */
3990
3991 /*
3992 * optional functions
3993 */
3997 //pgm->set_sck_period = jtagmkII_set_sck_period;
3998 //pgm->parseextparams = jtagmkII_parseextparms;
4001 pgm->page_size = 256;
4003}
static void jtagmkII_enable(PROGRAMMER *pgm)
Definition jtagmkII.c:1440
static int jtagmkII_chip_erase32(PROGRAMMER *pgm, AVRPART *p)
Definition jtagmkII.c:3176
#define PGM_FL_IS_JTAG
Definition jtagmkII.c:128
static int jtagmkII_open32(PROGRAMMER *pgm, char *port)
Definition jtagmkII.c:3334
static void jtagmkII_close32(PROGRAMMER *pgm)
Definition jtagmkII.c:3416
static int jtagmkII_paged_write32(PROGRAMMER *pgm, AVRPART *p, AVRMEM *m, unsigned int page_size, unsigned int addr, unsigned int n_bytes)
Definition jtagmkII.c:3560
static int jtagmkII_paged_load32(PROGRAMMER *pgm, AVRPART *p, AVRMEM *m, unsigned int page_size, unsigned int addr, unsigned int n_bytes)
Definition jtagmkII.c:3472
static void jtagmkII_print_parms(PROGRAMMER *pgm)
Definition jtagmkII.c:2718
static int jtagmkII_read_byte(PROGRAMMER *pgm, AVRPART *p, AVRMEM *mem, unsigned long addr, unsigned char *value)
Definition jtagmkII.c:2211
static int jtagmkII_program_enable_INFO(PROGRAMMER *pgm, AVRPART *p)
Definition jtagmkII.c:1145
void jtagmkII_teardown(PROGRAMMER *pgm)
Definition jtagmkII.c:186
static void jtagmkII_display(PROGRAMMER *pgm, const char *p)
Definition jtagmkII.c:2660
void jtagmkII_setup(PROGRAMMER *pgm)
Definition jtagmkII.c:176
static int jtagmkII_write_byte(PROGRAMMER *pgm, AVRPART *p, AVRMEM *mem, unsigned long addr, unsigned char data)
Definition jtagmkII.c:2392
static int jtagmkII_initialize32(PROGRAMMER *pgm, AVRPART *p)
Definition jtagmkII.c:3099
static void jtagmkII_disable(PROGRAMMER *pgm)
Definition jtagmkII.c:1424
static PROGRAMMER * pgm
Definition main.c:192
void(* display)(struct programmer_t *pgm, const char *p)
Definition libavrdude.h:644
int(* paged_write)(struct programmer_t *pgm, AVRPART *p, AVRMEM *m, unsigned int page_size, unsigned int baseaddr, unsigned int n_bytes)
Definition libavrdude.h:659
char flag
Definition libavrdude.h:690
int(* open)(struct programmer_t *pgm, char *port)
Definition libavrdude.h:657
int(* read_byte)(struct programmer_t *pgm, AVRPART *p, AVRMEM *m, unsigned long addr, unsigned char *value)
Definition libavrdude.h:670
int(* paged_load)(struct programmer_t *pgm, AVRPART *p, AVRMEM *m, unsigned int page_size, unsigned int baseaddr, unsigned int n_bytes)
Definition libavrdude.h:662
void(* teardown)(struct programmer_t *pgm)
Definition libavrdude.h:685
void(* enable)(struct programmer_t *pgm)
Definition libavrdude.h:645
int(* program_enable)(struct programmer_t *pgm, AVRPART *p)
Definition libavrdude.h:649
int(* write_byte)(struct programmer_t *pgm, AVRPART *p, AVRMEM *m, unsigned long addr, unsigned char value)
Definition libavrdude.h:668
void(* setup)(struct programmer_t *pgm)
Definition libavrdude.h:684
void(* print_parms)(struct programmer_t *pgm)
Definition libavrdude.h:673
char type[PGM_TYPELEN]
Definition libavrdude.h:619
int(* initialize)(struct programmer_t *pgm, AVRPART *p)
Definition libavrdude.h:643
void(* close)(struct programmer_t *pgm)
Definition libavrdude.h:658
int(* chip_erase)(struct programmer_t *pgm, AVRPART *p)
Definition libavrdude.h:650
void(* disable)(struct programmer_t *pgm)
Definition libavrdude.h:646
int page_size
Definition libavrdude.h:638

References programmer_t::chip_erase, programmer_t::close, programmer_t::disable, programmer_t::display, programmer_t::enable, programmer_t::flag, programmer_t::initialize, jtagmkII_chip_erase32(), jtagmkII_close32(), jtagmkII_disable(), jtagmkII_display(), jtagmkII_enable(), jtagmkII_initialize32(), jtagmkII_open32(), jtagmkII_paged_load32(), jtagmkII_paged_write32(), jtagmkII_print_parms(), jtagmkII_program_enable_INFO(), jtagmkII_read_byte(), jtagmkII_setup(), jtagmkII_teardown(), jtagmkII_write_byte(), programmer_t::open, programmer_t::page_size, programmer_t::paged_load, programmer_t::paged_write, pgm, PGM_FL_IS_JTAG, programmer_t::print_parms, programmer_t::program_enable, programmer_t::read_byte, programmer_t::setup, programmer_t::teardown, programmer_t::type, and programmer_t::write_byte.

+ Here is the call graph for this function:

◆ jtagmkII_avr32_reset()

static int jtagmkII_avr32_reset ( PROGRAMMER pgm,
unsigned char  val,
unsigned char  ret1,
unsigned char  ret2 
)
static
2767{
2768 int status;
2769 unsigned char buf[3], *resp;
2770
2771 avrdude_message(MSG_NOTICE, "%s: jtagmkII_avr32_reset(%2.2x)\n",
2772 progname, val);
2773
2774 buf[0] = CMND_GET_IR;
2775 buf[1] = 0x0C;
2776 status = jtagmkII_send(pgm, buf, 2);
2777 if(status < 0) return -1;
2778
2779 status = jtagmkII_recv(pgm, &resp);
2780 if (status != 2 || resp[0] != 0x87 || resp[1] != ret1) {
2781 avrdude_message(MSG_NOTICE, "%s: jtagmkII_avr32_reset(): "
2782 "Get_IR, expecting %2.2x but got %2.2x\n",
2783 progname, ret1, resp[1]);
2784
2785 //return -1;
2786 }
2787
2788 buf[0] = CMND_GET_xxx;
2789 buf[1] = 5;
2790 buf[2] = val;
2791 status = jtagmkII_send(pgm, buf, 3);
2792 if(status < 0) return -1;
2793
2794 status = jtagmkII_recv(pgm, &resp);
2795 if (status != 2 || resp[0] != 0x87 || resp[1] != ret2) {
2796 avrdude_message(MSG_NOTICE, "%s: jtagmkII_avr32_reset(): "
2797 "Get_XXX, expecting %2.2x but got %2.2x\n",
2798 progname, ret2, resp[1]);
2799 //return -1;
2800 }
2801
2802 return 0;
2803}
char * progname
Definition main.c:61
#define MSG_NOTICE
Definition avrdude.h:52
int avrdude_message(const int msglvl, const char *format,...)
Definition main.c:93
int jtagmkII_send(PROGRAMMER *pgm, unsigned char *data, size_t len)
Definition jtagmkII.c:423
int jtagmkII_recv(PROGRAMMER *pgm, unsigned char **msg)
Definition jtagmkII.c:619
#define CMND_GET_IR
Definition jtagmkII_private.h:104
#define CMND_GET_xxx
Definition jtagmkII_private.h:105

References avrdude_message(), CMND_GET_IR, CMND_GET_xxx, jtagmkII_recv(), jtagmkII_send(), MSG_NOTICE, pgm, and progname.

Referenced by jtagmkII_chip_erase32(), and jtagmkII_reset32().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_chip_erase()

static int jtagmkII_chip_erase ( PROGRAMMER pgm,
AVRPART p 
)
static
888{
889 int status, len;
890 unsigned char buf[6], *resp, c;
891
892 if (p->flags & AVRPART_HAS_PDI) {
893 buf[0] = CMND_XMEGA_ERASE;
894 buf[1] = XMEGA_ERASE_CHIP;
895 memset(buf + 2, 0, 4); /* address of area to be erased */
896 len = 6;
897 } else {
898 buf[0] = CMND_CHIP_ERASE;
899 len = 1;
900 }
901 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_chip_erase(): Sending %schip erase command: ",
902 progname,
903 (p->flags & AVRPART_HAS_PDI)? "Xmega ": "");
904 jtagmkII_send(pgm, buf, len);
905
906 status = jtagmkII_recv(pgm, &resp);
907 if (status <= 0) {
908 if (verbose >= 2)
909 putc('\n', stderr);
910 avrdude_message(MSG_INFO, "%s: jtagmkII_chip_erase(): "
911 "timeout/error communicating with programmer (status %d)\n",
912 progname, status);
913 return -1;
914 }
915 if (verbose >= 3) {
916 putc('\n', stderr);
917 jtagmkII_prmsg(pgm, resp, status);
918 } else if (verbose == 2)
919 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
920 c = resp[0];
921 free(resp);
922 if (c != RSP_OK) {
923 avrdude_message(MSG_INFO, "%s: jtagmkII_chip_erase(): "
924 "bad response to chip erase command: %s\n",
926 return -1;
927 }
928
929 if (!(p->flags & AVRPART_HAS_PDI))
930 pgm->initialize(pgm, p);
931
932 return 0;
933}
int verbose
Definition main.c:198
#define MSG_INFO
Definition avrdude.h:51
#define MSG_NOTICE2
Definition avrdude.h:53
void free(void *)
#define XMEGA_ERASE_CHIP
Definition jtag3_private.h:207
static const char * jtagmkII_get_rc(unsigned int rc)
Definition jtagmkII.c:250
static void jtagmkII_prmsg(PROGRAMMER *pgm, unsigned char *data, size_t len)
Definition jtagmkII.c:282
#define CMND_XMEGA_ERASE
Definition jtagmkII_private.h:112
#define CMND_CHIP_ERASE
Definition jtagmkII_private.h:95
#define RSP_OK
Definition jtagmkII_private.h:117
#define AVRPART_HAS_PDI
Definition libavrdude.h:202
unsigned flags
Definition libavrdude.h:230

References avrdude_message(), AVRPART_HAS_PDI, CMND_CHIP_ERASE, CMND_XMEGA_ERASE, avrpart::flags, free(), programmer_t::initialize, jtagmkII_get_rc(), jtagmkII_prmsg(), jtagmkII_recv(), jtagmkII_send(), MSG_INFO, MSG_NOTICE2, pgm, progname, RSP_OK, verbose, and XMEGA_ERASE_CHIP.

Referenced by jtagmkII_dragon_initpgm(), jtagmkII_dragon_pdi_initpgm(), jtagmkII_initpgm(), and jtagmkII_pdi_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_chip_erase32()

static int jtagmkII_chip_erase32 ( PROGRAMMER pgm,
AVRPART p 
)
static
3177{
3178 int status=0, loops;
3179 unsigned char *resp, buf[3], x, ret[4], *retP;
3180 unsigned long val=0;
3181 unsigned int lineno;
3182
3183 avrdude_message(MSG_NOTICE, "%s: jtagmkII_chip_erase32()\n",
3184 progname);
3185
3187 if(status != 0) {lineno = __LINE__; goto eRR;}
3188
3189 // sequence of IR transitions
3190 ret[0] = 0x01;
3191 ret[1] = 0x05;
3192 ret[2] = 0x01;
3193 ret[3] = 0x00;
3194
3195 retP = ret;
3196 for(loops=0; loops<1000; ++loops) {
3197 buf[0] = CMND_GET_IR;
3198 buf[1] = 0x0F;
3199 status = jtagmkII_send(pgm, buf, 2);
3200 if(status < 0) {lineno = __LINE__; goto eRR;}
3201
3202 status = jtagmkII_recv(pgm, &resp);
3203 if (status != 2 || resp[0] != 0x87) {
3204 {lineno = __LINE__; goto eRR;}
3205 }
3206 x = resp[1];
3207 free(resp);
3208 if(x == *retP) ++retP;
3209 if(*retP == 0x00) break;
3210 }
3211 if(loops == 1000) {lineno = __LINE__; goto eRR;}
3212
3213 status = jtagmkII_avr32_reset(pgm, 0x00, 0x01, 0x01);
3214 if(status < 0) {lineno = __LINE__; goto eRR;}
3215
3216 val = jtagmkII_read_SABaddr(pgm, 0x00000010, 0x06);
3217 if(val != 0x00000000) {lineno = __LINE__; goto eRR;}
3218
3219 // AVR32 "special"
3220 buf[0] = CMND_SET_PARAMETER;
3221 buf[1] = 0x03;
3222 buf[2] = 0x02;
3223 jtagmkII_send(pgm, buf, 3);
3224 status = jtagmkII_recv(pgm, &resp);
3225 if(status < 0 || resp[0] != RSP_OK) {lineno = __LINE__; goto eRR;}
3226 free(resp);
3227
3228 return 0;
3229
3230 eRR:
3231 avrdude_message(MSG_INFO, "%s: jtagmkII_reset32(): "
3232 "failed at line %d (status=%x val=%lx)\n",
3233 progname, lineno, status, val);
3234 return -1;
3235}
int lineno
Definition config.c:54
static int jtagmkII_reset32(PROGRAMMER *pgm, unsigned short flags)
Definition jtagmkII.c:2806
static int jtagmkII_avr32_reset(PROGRAMMER *pgm, unsigned char val, unsigned char ret1, unsigned char ret2)
Definition jtagmkII.c:2765
static unsigned long jtagmkII_read_SABaddr(PROGRAMMER *pgm, unsigned long addr, unsigned int prefix)
Definition jtagmkII.c:3237
#define CMND_SET_PARAMETER
Definition jtagmkII_private.h:79
#define AVR32_RESET_CHIP_ERASE
Definition jtagmkII_private.h:297
TCoord< P > x(const P &p)
Definition geometry_traits.hpp:297

References AVR32_RESET_CHIP_ERASE, avrdude_message(), CMND_GET_IR, CMND_SET_PARAMETER, free(), jtagmkII_avr32_reset(), jtagmkII_read_SABaddr(), jtagmkII_recv(), jtagmkII_reset32(), jtagmkII_send(), lineno, MSG_INFO, MSG_NOTICE, pgm, progname, and RSP_OK.

Referenced by jtagmkII_avr32_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_chip_erase_dw()

static int jtagmkII_chip_erase_dw ( PROGRAMMER pgm,
AVRPART p 
)
static
939{
940
941 avrdude_message(MSG_INFO, "%s: Chip erase not supported in debugWire mode\n",
942 progname);
943
944 return 0;
945}

References avrdude_message(), MSG_INFO, and progname.

Referenced by jtagmkII_dragon_dw_initpgm(), and jtagmkII_dw_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_close()

void jtagmkII_close ( PROGRAMMER pgm)
1813{
1814 int status;
1815 unsigned char buf[1], *resp, c;
1816
1817 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_close()\n", progname);
1818
1819 if (pgm->flag & PGM_FL_IS_PDI) {
1820 /* When in PDI mode, restart target. */
1821 buf[0] = CMND_GO;
1822 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_close(): Sending GO command: ",
1823 progname);
1824 jtagmkII_send(pgm, buf, 1);
1825
1826 status = jtagmkII_recv(pgm, &resp);
1827 if (status <= 0) {
1828 if (verbose >= 2)
1829 putc('\n', stderr);
1830 avrdude_message(MSG_INFO, "%s: jtagmkII_close(): "
1831 "timeout/error communicating with programmer (status %d)\n",
1832 progname, status);
1833 } else {
1834 if (verbose >= 3) {
1835 putc('\n', stderr);
1836 jtagmkII_prmsg(pgm, resp, status);
1837 } else if (verbose == 2)
1838 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
1839 c = resp[0];
1840 free(resp);
1841 if (c != RSP_OK) {
1842 avrdude_message(MSG_INFO, "%s: jtagmkII_close(): "
1843 "bad response to GO command: %s\n",
1845 }
1846 }
1847 }
1848
1849 buf[0] = CMND_SIGN_OFF;
1850 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_close(): Sending sign-off command: ",
1851 progname);
1852 jtagmkII_send(pgm, buf, 1);
1853
1854 status = jtagmkII_recv(pgm, &resp);
1855 if (status <= 0) {
1856 if (verbose >= 2)
1857 putc('\n', stderr);
1858 avrdude_message(MSG_INFO, "%s: jtagmkII_close(): "
1859 "timeout/error communicating with programmer (status %d)\n",
1860 progname, status);
1861 return;
1862 }
1863 if (verbose >= 3) {
1864 putc('\n', stderr);
1865 jtagmkII_prmsg(pgm, resp, status);
1866 } else if (verbose == 2)
1867 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
1868 c = resp[0];
1869 free(resp);
1870 if (c != RSP_OK) {
1871 avrdude_message(MSG_INFO, "%s: jtagmkII_close(): "
1872 "bad response to sign-off command: %s\n",
1874 }
1875
1876 serial_close(&pgm->fd);
1877 pgm->fd.ifd = -1;
1878}
#define PGM_FL_IS_PDI
Definition jtagmkII.c:127
#define CMND_GO
Definition jtagmkII_private.h:85
#define CMND_SIGN_OFF
Definition jtagmkII_private.h:77
#define serial_close
Definition libavrdude.h:576
int ifd
Definition libavrdude.h:522
union filedescriptor fd
Definition libavrdude.h:637

References avrdude_message(), CMND_GO, CMND_SIGN_OFF, programmer_t::fd, programmer_t::flag, free(), filedescriptor::ifd, jtagmkII_get_rc(), jtagmkII_prmsg(), jtagmkII_recv(), jtagmkII_send(), MSG_INFO, MSG_NOTICE2, pgm, PGM_FL_IS_PDI, progname, RSP_OK, serial_close, and verbose.

Referenced by jtagmkII_dragon_dw_initpgm(), jtagmkII_dragon_initpgm(), jtagmkII_dragon_pdi_initpgm(), jtagmkII_dw_initpgm(), jtagmkII_initpgm(), and jtagmkII_pdi_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_close32()

static void jtagmkII_close32 ( PROGRAMMER pgm)
static
3417{
3418 int status, lineno;
3419 unsigned char *resp, buf[3], c;
3420 unsigned long val=0;
3421
3422 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_close32()\n", progname);
3423
3424 // AVR32 "special"
3425 buf[0] = CMND_SET_PARAMETER;
3426 buf[1] = 0x03;
3427 buf[2] = 0x02;
3428 jtagmkII_send(pgm, buf, 3);
3429 status = jtagmkII_recv(pgm, &resp);
3430 if(status < 0 || resp[0] != RSP_OK) {lineno = __LINE__; goto eRR;}
3431 free(resp);
3432
3433 buf[0] = CMND_SIGN_OFF;
3434 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_close(): Sending sign-off command: ",
3435 progname);
3436 jtagmkII_send(pgm, buf, 1);
3437
3438 status = jtagmkII_recv(pgm, &resp);
3439 if (status <= 0) {
3440 if (verbose >= 2)
3441 putc('\n', stderr);
3442 avrdude_message(MSG_INFO, "%s: jtagmkII_close(): "
3443 "timeout/error communicating with programmer (status %d)\n",
3444 progname, status);
3445 return;
3446 }
3447 if (verbose >= 3) {
3448 putc('\n', stderr);
3449 jtagmkII_prmsg(pgm, resp, status);
3450 } else if (verbose == 2)
3451 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
3452 c = resp[0];
3453 free(resp);
3454 if (c != RSP_OK) {
3455 avrdude_message(MSG_INFO, "%s: jtagmkII_close(): "
3456 "bad response to sign-off command: %s\n",
3458 }
3459
3460 ret:
3461 serial_close(&pgm->fd);
3462 pgm->fd.ifd = -1;
3463 return;
3464
3465 eRR:
3466 avrdude_message(MSG_INFO, "%s: jtagmkII_reset32(): "
3467 "failed at line %d (status=%x val=%lx)\n",
3468 progname, lineno, status, val);
3469 goto ret;
3470}

References avrdude_message(), CMND_SET_PARAMETER, CMND_SIGN_OFF, programmer_t::fd, free(), filedescriptor::ifd, jtagmkII_get_rc(), jtagmkII_prmsg(), jtagmkII_recv(), jtagmkII_send(), lineno, MSG_INFO, MSG_NOTICE2, pgm, progname, RSP_OK, serial_close, and verbose.

Referenced by jtagmkII_avr32_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_disable()

static void jtagmkII_disable ( PROGRAMMER pgm)
static
1425{
1426
1427 free(PDATA(pgm)->flash_pagecache);
1428 PDATA(pgm)->flash_pagecache = NULL;
1429 free(PDATA(pgm)->eeprom_pagecache);
1430 PDATA(pgm)->eeprom_pagecache = NULL;
1431
1432 /*
1433 * jtagmkII_program_disable() doesn't do anything if the
1434 * device is currently not in programming mode, so just
1435 * call it unconditionally here.
1436 */
1438}
typedef void(GLAPIENTRYP _GLUfuncptr)(void)
#define PDATA(pgm)
Definition jtagmkII.c:88
static int jtagmkII_program_disable(PROGRAMMER *pgm)
Definition jtagmkII.c:1206

References free(), jtagmkII_program_disable(), PDATA, pgm, and void().

Referenced by jtagmkII_avr32_initpgm(), jtagmkII_dragon_dw_initpgm(), jtagmkII_dragon_initpgm(), jtagmkII_dragon_pdi_initpgm(), jtagmkII_dw_initpgm(), jtagmkII_initpgm(), and jtagmkII_pdi_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_display()

static void jtagmkII_display ( PROGRAMMER pgm,
const char *  p 
)
static
2661{
2662 unsigned char hw[4], fw[4];
2663
2664 if (jtagmkII_getparm(pgm, PAR_HW_VERSION, hw) < 0 ||
2666 return;
2667
2668 avrdude_message(MSG_INFO, "%sM_MCU hardware version: %d\n", p, hw[0]);
2669 avrdude_message(MSG_INFO, "%sM_MCU firmware version: %d.%02d\n", p, fw[1], fw[0]);
2670 avrdude_message(MSG_INFO, "%sS_MCU hardware version: %d\n", p, hw[1]);
2671 avrdude_message(MSG_INFO, "%sS_MCU firmware version: %d.%02d\n", p, fw[3], fw[2]);
2672 avrdude_message(MSG_INFO, "%sSerial number: %02x:%02x:%02x:%02x:%02x:%02x\n",
2673 p, PDATA(pgm)->serno[0], PDATA(pgm)->serno[1], PDATA(pgm)->serno[2], PDATA(pgm)->serno[3], PDATA(pgm)->serno[4], PDATA(pgm)->serno[5]);
2674
2676
2677 return;
2678}
static void jtagmkII_print_parms1(PROGRAMMER *pgm, const char *p)
Definition jtagmkII.c:2681
int jtagmkII_getparm(PROGRAMMER *pgm, unsigned char parm, unsigned char *value)
Definition jtagmkII.c:2547
#define PAR_HW_VERSION
Definition jtagmkII_private.h:189
#define PAR_FW_VERSION
Definition jtagmkII_private.h:190

References avrdude_message(), jtagmkII_getparm(), jtagmkII_print_parms1(), MSG_INFO, PAR_FW_VERSION, PAR_HW_VERSION, PDATA, and pgm.

Referenced by jtagmkII_avr32_initpgm(), jtagmkII_dragon_dw_initpgm(), jtagmkII_dragon_initpgm(), jtagmkII_dragon_pdi_initpgm(), jtagmkII_dw_initpgm(), jtagmkII_initpgm(), and jtagmkII_pdi_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_dragon_dw_initpgm()

void jtagmkII_dragon_dw_initpgm ( PROGRAMMER pgm)
3942{
3943 strcpy(pgm->type, "DRAGON_DW");
3944
3945 /*
3946 * mandatory functions
3947 */
3958
3959 /*
3960 * optional functions
3961 */
3967 pgm->page_size = 256;
3969}
static int jtagmkII_dragon_open_dw(PROGRAMMER *pgm, char *port)
Definition jtagmkII.c:1702
void jtagmkII_close(PROGRAMMER *pgm)
Definition jtagmkII.c:1812
static int jtagmkII_paged_load(PROGRAMMER *pgm, AVRPART *p, AVRMEM *m, unsigned int page_size, unsigned int addr, unsigned int n_bytes)
Definition jtagmkII.c:2110
static int jtagmkII_paged_write(PROGRAMMER *pgm, AVRPART *p, AVRMEM *m, unsigned int page_size, unsigned int addr, unsigned int n_bytes)
Definition jtagmkII.c:1975
static int jtagmkII_initialize(PROGRAMMER *pgm, AVRPART *p)
Definition jtagmkII.c:1276
#define PGM_FL_IS_DW
Definition jtagmkII.c:126
static int jtagmkII_chip_erase_dw(PROGRAMMER *pgm, AVRPART *p)
Definition jtagmkII.c:938

References programmer_t::chip_erase, programmer_t::close, programmer_t::disable, programmer_t::display, programmer_t::enable, programmer_t::flag, programmer_t::initialize, jtagmkII_chip_erase_dw(), jtagmkII_close(), jtagmkII_disable(), jtagmkII_display(), jtagmkII_dragon_open_dw(), jtagmkII_enable(), jtagmkII_initialize(), jtagmkII_paged_load(), jtagmkII_paged_write(), jtagmkII_print_parms(), jtagmkII_program_enable_INFO(), jtagmkII_read_byte(), jtagmkII_setup(), jtagmkII_teardown(), jtagmkII_write_byte(), programmer_t::open, programmer_t::page_size, programmer_t::paged_load, programmer_t::paged_write, pgm, PGM_FL_IS_DW, programmer_t::print_parms, programmer_t::program_enable, programmer_t::read_byte, programmer_t::setup, programmer_t::teardown, programmer_t::type, and programmer_t::write_byte.

+ Here is the call graph for this function:

◆ jtagmkII_dragon_initpgm()

void jtagmkII_dragon_initpgm ( PROGRAMMER pgm)
3907{
3908 strcpy(pgm->type, "DRAGON_JTAG");
3909
3910 /*
3911 * mandatory functions
3912 */
3923
3924 /*
3925 * optional functions
3926 */
3935 pgm->page_size = 256;
3937}
static int jtagmkII_dragon_open(PROGRAMMER *pgm, char *port)
Definition jtagmkII.c:1647
static int jtagmkII_parseextparms(PROGRAMMER *pgm, LISTID extparms)
Definition jtagmkII.c:1445
static int jtagmkII_set_sck_period(PROGRAMMER *pgm, double v)
Definition jtagmkII.c:2524
static int jtagmkII_chip_erase(PROGRAMMER *pgm, AVRPART *p)
Definition jtagmkII.c:887
static int jtagmkII_page_erase(PROGRAMMER *pgm, AVRPART *p, AVRMEM *m, unsigned int addr)
Definition jtagmkII.c:1880
int(* parseextparams)(struct programmer_t *pgm, LISTID xparams)
Definition libavrdude.h:683
int(* page_erase)(struct programmer_t *pgm, AVRPART *p, AVRMEM *m, unsigned int baseaddr)
Definition libavrdude.h:665
int(* set_sck_period)(struct programmer_t *pgm, double v)
Definition libavrdude.h:677

References programmer_t::chip_erase, programmer_t::close, programmer_t::disable, programmer_t::display, programmer_t::enable, programmer_t::flag, programmer_t::initialize, jtagmkII_chip_erase(), jtagmkII_close(), jtagmkII_disable(), jtagmkII_display(), jtagmkII_dragon_open(), jtagmkII_enable(), jtagmkII_initialize(), jtagmkII_page_erase(), jtagmkII_paged_load(), jtagmkII_paged_write(), jtagmkII_parseextparms(), jtagmkII_print_parms(), jtagmkII_program_enable_INFO(), jtagmkII_read_byte(), jtagmkII_set_sck_period(), jtagmkII_setup(), jtagmkII_teardown(), jtagmkII_write_byte(), programmer_t::open, programmer_t::page_erase, programmer_t::page_size, programmer_t::paged_load, programmer_t::paged_write, programmer_t::parseextparams, pgm, PGM_FL_IS_JTAG, programmer_t::print_parms, programmer_t::program_enable, programmer_t::read_byte, programmer_t::set_sck_period, programmer_t::setup, programmer_t::teardown, programmer_t::type, and programmer_t::write_byte.

+ Here is the call graph for this function:

◆ jtagmkII_dragon_open()

static int jtagmkII_dragon_open ( PROGRAMMER pgm,
char *  port 
)
static
1648{
1649 union pinfo pinfo;
1650
1651 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_dragon_open()\n", progname);
1652
1653 /*
1654 * The JTAG ICE mkII always starts with a baud rate of 19200 Bd upon
1655 * attaching. If the config file or command-line parameters specify
1656 * a higher baud rate, we switch to it later on, after establishing
1657 * the connection with the ICE.
1658 */
1659 pinfo.baud = 19200;
1660
1661 /*
1662 * If the port name starts with "usb", divert the serial routines
1663 * to the USB ones. The serial_open() function for USB overrides
1664 * the meaning of the "baud" parameter to be the USB device ID to
1665 * search for.
1666 */
1667 if (strncmp(port, "usb", 3) == 0) {
1668#if defined(HAVE_LIBUSB)
1669 serdev = &usb_serdev;
1671 pinfo.usbinfo.flags = 0;
1673 pgm->fd.usb.max_xfer = USBDEV_MAX_XFER_MKII;
1676 pgm->fd.usb.eep = 0; /* no seperate EP for events */
1677#else
1678 avrdude_message(MSG_INFO, "avrdude was compiled without usb support.\n");
1679 return -1;
1680#endif
1681 }
1682
1683 strcpy(pgm->port, port);
1684 if (serial_open(port, pinfo, &pgm->fd)==-1) {
1685 return -1;
1686 }
1687
1688 /*
1689 * drain any extraneous input
1690 */
1691 jtagmkII_drain(pgm, 0);
1692
1694 serial_close(&pgm->fd);
1695 return -1;
1696 }
1697
1698 return 0;
1699}
static int jtagmkII_drain(PROGRAMMER *pgm, int display)
Definition jtagmkII.c:458
int jtagmkII_getsync(PROGRAMMER *pgm, int mode)
Definition jtagmkII.c:675
#define EMULATOR_MODE_JTAG
Definition jtagmkII_private.h:193
struct serial_device * serdev
Definition ser_posix.c:562
#define serial_open
Definition libavrdude.h:574
struct filedescriptor::@12 usb
struct pinfo::@13 usbinfo
struct serial_device usb_serdev
long baud
Definition libavrdude.h:537
Definition libavrdude.h:536
char port[PGM_PORTLEN]
Definition libavrdude.h:620
#define USB_VENDOR_ATMEL
Definition usbdevs.h:28
#define USBDEV_BULK_EP_WRITE_MKII
Definition usbdevs.h:60
#define USB_DEVICE_AVRDRAGON
Definition usbdevs.h:32
#define USBDEV_MAX_XFER_MKII
Definition usbdevs.h:62
#define USBDEV_BULK_EP_READ_MKII
Definition usbdevs.h:61

References avrdude_message(), pinfo::baud, EMULATOR_MODE_JTAG, programmer_t::fd, jtagmkII_drain(), jtagmkII_getsync(), MSG_INFO, MSG_NOTICE2, pgm, programmer_t::port, progname, serdev, serial_close, serial_open, filedescriptor::usb, USB_DEVICE_AVRDRAGON, usb_serdev, USB_VENDOR_ATMEL, USBDEV_BULK_EP_READ_MKII, USBDEV_BULK_EP_WRITE_MKII, USBDEV_MAX_XFER_MKII, and pinfo::usbinfo.

Referenced by jtagmkII_dragon_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_dragon_open_dw()

static int jtagmkII_dragon_open_dw ( PROGRAMMER pgm,
char *  port 
)
static
1703{
1704 union pinfo pinfo;
1705
1706 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_dragon_open_dw()\n", progname);
1707
1708 /*
1709 * The JTAG ICE mkII always starts with a baud rate of 19200 Bd upon
1710 * attaching. If the config file or command-line parameters specify
1711 * a higher baud rate, we switch to it later on, after establishing
1712 * the connection with the ICE.
1713 */
1714 pinfo.baud = 19200;
1715
1716 /*
1717 * If the port name starts with "usb", divert the serial routines
1718 * to the USB ones. The serial_open() function for USB overrides
1719 * the meaning of the "baud" parameter to be the USB device ID to
1720 * search for.
1721 */
1722 if (strncmp(port, "usb", 3) == 0) {
1723#if defined(HAVE_LIBUSB)
1724 serdev = &usb_serdev;
1726 pinfo.usbinfo.flags = 0;
1728 pgm->fd.usb.max_xfer = USBDEV_MAX_XFER_MKII;
1731 pgm->fd.usb.eep = 0; /* no seperate EP for events */
1732#else
1733 avrdude_message(MSG_INFO, "avrdude was compiled without usb support.\n");
1734 return -1;
1735#endif
1736 }
1737
1738 strcpy(pgm->port, port);
1739 if (serial_open(port, pinfo, &pgm->fd)==-1) {
1740 return -1;
1741 }
1742
1743 /*
1744 * drain any extraneous input
1745 */
1746 jtagmkII_drain(pgm, 0);
1747
1749 serial_close(&pgm->fd);
1750 return -1;
1751 }
1752
1753 return 0;
1754}
#define EMULATOR_MODE_DEBUGWIRE
Definition jtagmkII_private.h:192

References avrdude_message(), pinfo::baud, EMULATOR_MODE_DEBUGWIRE, programmer_t::fd, jtagmkII_drain(), jtagmkII_getsync(), MSG_INFO, MSG_NOTICE2, pgm, programmer_t::port, progname, serdev, serial_close, serial_open, filedescriptor::usb, USB_DEVICE_AVRDRAGON, usb_serdev, USB_VENDOR_ATMEL, USBDEV_BULK_EP_READ_MKII, USBDEV_BULK_EP_WRITE_MKII, USBDEV_MAX_XFER_MKII, and pinfo::usbinfo.

Referenced by jtagmkII_dragon_dw_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_dragon_open_pdi()

static int jtagmkII_dragon_open_pdi ( PROGRAMMER pgm,
char *  port 
)
static
1758{
1759 union pinfo pinfo;
1760
1761 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_dragon_open_pdi()\n", progname);
1762
1763 /*
1764 * The JTAG ICE mkII always starts with a baud rate of 19200 Bd upon
1765 * attaching. If the config file or command-line parameters specify
1766 * a higher baud rate, we switch to it later on, after establishing
1767 * the connection with the ICE.
1768 */
1769 pinfo.baud = 19200;
1770
1771 /*
1772 * If the port name starts with "usb", divert the serial routines
1773 * to the USB ones. The serial_open() function for USB overrides
1774 * the meaning of the "baud" parameter to be the USB device ID to
1775 * search for.
1776 */
1777 if (strncmp(port, "usb", 3) == 0) {
1778#if defined(HAVE_LIBUSB)
1779 serdev = &usb_serdev;
1781 pinfo.usbinfo.flags = 0;
1783 pgm->fd.usb.max_xfer = USBDEV_MAX_XFER_MKII;
1786 pgm->fd.usb.eep = 0; /* no seperate EP for events */
1787#else
1788 avrdude_message(MSG_INFO, "avrdude was compiled without usb support.\n");
1789 return -1;
1790#endif
1791 }
1792
1793 strcpy(pgm->port, port);
1794 if (serial_open(port, pinfo, &pgm->fd)==-1) {
1795 return -1;
1796 }
1797
1798 /*
1799 * drain any extraneous input
1800 */
1801 jtagmkII_drain(pgm, 0);
1802
1804 serial_close(&pgm->fd);
1805 return -1;
1806 }
1807
1808 return 0;
1809}
#define EMULATOR_MODE_PDI
Definition jtagmkII_private.h:198

References avrdude_message(), pinfo::baud, EMULATOR_MODE_PDI, programmer_t::fd, jtagmkII_drain(), jtagmkII_getsync(), MSG_INFO, MSG_NOTICE2, pgm, programmer_t::port, progname, serdev, serial_close, serial_open, filedescriptor::usb, USB_DEVICE_AVRDRAGON, usb_serdev, USB_VENDOR_ATMEL, USBDEV_BULK_EP_READ_MKII, USBDEV_BULK_EP_WRITE_MKII, USBDEV_MAX_XFER_MKII, and pinfo::usbinfo.

Referenced by jtagmkII_dragon_pdi_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_dragon_pdi_initpgm()

void jtagmkII_dragon_pdi_initpgm ( PROGRAMMER pgm)
4008{
4009 strcpy(pgm->type, "DRAGON_PDI");
4010
4011 /*
4012 * mandatory functions
4013 */
4024
4025 /*
4026 * optional functions
4027 */
4034 pgm->page_size = 256;
4036}
static int jtagmkII_dragon_open_pdi(PROGRAMMER *pgm, char *port)
Definition jtagmkII.c:1757

References programmer_t::chip_erase, programmer_t::close, programmer_t::disable, programmer_t::display, programmer_t::enable, programmer_t::flag, programmer_t::initialize, jtagmkII_chip_erase(), jtagmkII_close(), jtagmkII_disable(), jtagmkII_display(), jtagmkII_dragon_open_pdi(), jtagmkII_enable(), jtagmkII_initialize(), jtagmkII_page_erase(), jtagmkII_paged_load(), jtagmkII_paged_write(), jtagmkII_print_parms(), jtagmkII_program_enable_INFO(), jtagmkII_read_byte(), jtagmkII_setup(), jtagmkII_teardown(), jtagmkII_write_byte(), programmer_t::open, programmer_t::page_erase, programmer_t::page_size, programmer_t::paged_load, programmer_t::paged_write, pgm, PGM_FL_IS_PDI, programmer_t::print_parms, programmer_t::program_enable, programmer_t::read_byte, programmer_t::setup, programmer_t::teardown, programmer_t::type, and programmer_t::write_byte.

+ Here is the call graph for this function:

◆ jtagmkII_drain()

static int jtagmkII_drain ( PROGRAMMER pgm,
int  display 
)
static
459{
460 return serial_drain(&pgm->fd, display);
461}
#define serial_drain
Definition libavrdude.h:579

References programmer_t::fd, pgm, and serial_drain.

Referenced by jtagmkII_dragon_open(), jtagmkII_dragon_open_dw(), jtagmkII_dragon_open_pdi(), jtagmkII_open(), jtagmkII_open32(), jtagmkII_open_dw(), and jtagmkII_open_pdi().

+ Here is the caller graph for this function:

◆ jtagmkII_dw_initpgm()

void jtagmkII_dw_initpgm ( PROGRAMMER pgm)
3842{
3843 strcpy(pgm->type, "JTAGMKII_DW");
3844
3845 /*
3846 * mandatory functions
3847 */
3858
3859 /*
3860 * optional functions
3861 */
3867 pgm->page_size = 256;
3869}
static int jtagmkII_open_dw(PROGRAMMER *pgm, char *port)
Definition jtagmkII.c:1538

References programmer_t::chip_erase, programmer_t::close, programmer_t::disable, programmer_t::display, programmer_t::enable, programmer_t::flag, programmer_t::initialize, jtagmkII_chip_erase_dw(), jtagmkII_close(), jtagmkII_disable(), jtagmkII_display(), jtagmkII_enable(), jtagmkII_initialize(), jtagmkII_open_dw(), jtagmkII_paged_load(), jtagmkII_paged_write(), jtagmkII_print_parms(), jtagmkII_program_enable_INFO(), jtagmkII_read_byte(), jtagmkII_setup(), jtagmkII_teardown(), jtagmkII_write_byte(), programmer_t::open, programmer_t::page_size, programmer_t::paged_load, programmer_t::paged_write, pgm, PGM_FL_IS_DW, programmer_t::print_parms, programmer_t::program_enable, programmer_t::read_byte, programmer_t::setup, programmer_t::teardown, programmer_t::type, and programmer_t::write_byte.

+ Here is the call graph for this function:

◆ jtagmkII_enable()

static void jtagmkII_enable ( PROGRAMMER pgm)
static
1441{
1442 return;
1443}

Referenced by jtagmkII_avr32_initpgm(), jtagmkII_dragon_dw_initpgm(), jtagmkII_dragon_initpgm(), jtagmkII_dragon_pdi_initpgm(), jtagmkII_dw_initpgm(), jtagmkII_initpgm(), and jtagmkII_pdi_initpgm().

+ Here is the caller graph for this function:

◆ jtagmkII_flash_clear_pagebuffer32()

static int jtagmkII_flash_clear_pagebuffer32 ( PROGRAMMER pgm)
static
3772{
3773 int status, lineno, i;
3774 unsigned long val=0, cmd, err;
3775
3778 if (status < 0) {lineno = __LINE__; goto eRR;}
3779
3780 err = 0;
3781 for(i=0; i<256; ++i) {
3783 if(val == ERROR_SAB) continue;
3784 err |= val;
3785 if(val & AVR32_FLASHC_FSR_RDY) break;
3786 }
3787 if(val == ERROR_SAB) {lineno = __LINE__; goto eRR;}
3788 if(!(val & AVR32_FLASHC_FSR_RDY)) {lineno = __LINE__; goto eRR;}
3789 if(err & AVR32_FLASHC_FSR_ERR) {lineno = __LINE__; goto eRR;}
3790
3791 return 0;
3792
3793 eRR:
3794 avrdude_message(MSG_INFO, "%s: jtagmkII_flash_clear_pagebuffer32(): "
3795 "failed at line %d cmd %8.8lx val %lx\n",
3796 progname, lineno, cmd, val);
3797 return -1;
3798}
#define ERROR_SAB
Definition jtagmkII.c:150
static int jtagmkII_write_SABaddr(PROGRAMMER *pgm, unsigned long addr, unsigned int prefix, unsigned long val)
Definition jtagmkII.c:3299
#define AVR32_FLASHC_FCMD
Definition jtagmkII_private.h:270
#define AVR32_FLASHC_FSR
Definition jtagmkII_private.h:277
#define AVR32_FLASHC_FSR_ERR
Definition jtagmkII_private.h:279
#define AVR32_FLASHC_FSR_RDY
Definition jtagmkII_private.h:278
#define AVR32_FLASHC_FCMD_CLEAR_PAGE_BUFFER
Definition jtagmkII_private.h:274
#define AVR32_FLASHC_FCMD_KEY
Definition jtagmkII_private.h:271
struct command cmd[]
Definition term.c:94

References AVR32_FLASHC_FCMD, AVR32_FLASHC_FCMD_CLEAR_PAGE_BUFFER, AVR32_FLASHC_FCMD_KEY, AVR32_FLASHC_FSR, AVR32_FLASHC_FSR_ERR, AVR32_FLASHC_FSR_RDY, avrdude_message(), cmd, ERROR_SAB, jtagmkII_read_SABaddr(), jtagmkII_write_SABaddr(), lineno, MSG_INFO, pgm, and progname.

Referenced by jtagmkII_paged_write32().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_flash_erase32()

static int jtagmkII_flash_erase32 ( PROGRAMMER pgm,
unsigned int  page 
)
static
3702{
3703 int status, lineno, i;
3704 unsigned long val=0, cmd=0, err=0;
3705
3706 for(i=0; i<256; ++i) {
3708 if(val == ERROR_SAB) continue;
3709 if(val & AVR32_FLASHC_FSR_RDY) break;
3710 }
3711 if(val == ERROR_SAB) {lineno = __LINE__; goto eRR;}
3712 if(!(val&AVR32_FLASHC_FSR_RDY)) {lineno = __LINE__; goto eRR;} // Flash better be ready
3713
3714 page <<= 8;
3717 if (status < 0) {lineno = __LINE__; goto eRR;}
3718
3719//avrdude_message(MSG_INFO, "ERASE %x -> %x\n", cmd, AVR32_FLASHC_FCMD);
3720
3721 err = 0;
3722 for(i=0; i<256; ++i) {
3724 if(val == ERROR_SAB) continue;
3725 err |= val;
3726 if(val & AVR32_FLASHC_FSR_RDY) break;
3727 }
3728 if(val == ERROR_SAB) {lineno = __LINE__; goto eRR;}
3729 if(!(val & AVR32_FLASHC_FSR_RDY)) {lineno = __LINE__; goto eRR;}
3730 if(err & AVR32_FLASHC_FSR_ERR) {lineno = __LINE__; goto eRR;}
3731
3732 return 0;
3733
3734 eRR:
3735 avrdude_message(MSG_INFO, "%s: jtagmkII_flash_erase32(): "
3736 "failed at line %d page %d cmd %8.8lx val %lx\n",
3737 progname, lineno, page, cmd, val);
3738 return -1;
3739}
#define AVR32_FLASHC_FCMD_ERASE_PAGE
Definition jtagmkII_private.h:273

References AVR32_FLASHC_FCMD, AVR32_FLASHC_FCMD_ERASE_PAGE, AVR32_FLASHC_FCMD_KEY, AVR32_FLASHC_FSR, AVR32_FLASHC_FSR_ERR, AVR32_FLASHC_FSR_RDY, avrdude_message(), cmd, ERROR_SAB, jtagmkII_read_SABaddr(), jtagmkII_write_SABaddr(), lineno, MSG_INFO, pgm, and progname.

Referenced by jtagmkII_paged_write32().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_flash_lock32()

static int jtagmkII_flash_lock32 ( PROGRAMMER pgm,
unsigned char  lock,
unsigned int  page 
)
static
3675{
3676 int status, lineno, i;
3677 unsigned long val, cmd=0;
3678
3679 for(i=0; i<256; ++i) {
3681 if(val == ERROR_SAB) continue;
3682 if(val & AVR32_FLASHC_FSR_RDY) break;
3683 }
3684 if(val == ERROR_SAB) {lineno = __LINE__; goto eRR;}
3685 if(!(val&AVR32_FLASHC_FSR_RDY)) {lineno = __LINE__; goto eRR;} // Flash better be ready
3686
3687 page <<= 8;
3690 if (status < 0) {lineno = __LINE__; goto eRR;}
3691
3692 return 0;
3693
3694 eRR:
3695 avrdude_message(MSG_INFO, "%s: jtagmkII_flash_lock32(): "
3696 "failed at line %d page %d cmd %8.8lx\n",
3697 progname, lineno, page, cmd);
3698 return -1;
3699}
#define AVR32_FLASHC_FCMD_LOCK
Definition jtagmkII_private.h:275
#define AVR32_FLASHC_FCMD_UNLOCK
Definition jtagmkII_private.h:276

References AVR32_FLASHC_FCMD, AVR32_FLASHC_FCMD_KEY, AVR32_FLASHC_FCMD_LOCK, AVR32_FLASHC_FCMD_UNLOCK, AVR32_FLASHC_FSR, AVR32_FLASHC_FSR_RDY, avrdude_message(), cmd, ERROR_SAB, jtagmkII_read_SABaddr(), jtagmkII_write_SABaddr(), lineno, MSG_INFO, pgm, and progname.

Referenced by jtagmkII_paged_write32().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_flash_write_page32()

static int jtagmkII_flash_write_page32 ( PROGRAMMER pgm,
unsigned int  page 
)
static
3742{
3743 int status, lineno, i;
3744 unsigned long val=0, cmd, err;
3745
3746 page <<= 8;
3749 if (status < 0) {lineno = __LINE__; goto eRR;}
3750
3751 err = 0;
3752 for(i=0; i<256; ++i) {
3754 if(val == ERROR_SAB) continue;
3755 err |= val;
3756 if(val & AVR32_FLASHC_FSR_RDY) break;
3757 }
3758 if(val == ERROR_SAB) {lineno = __LINE__; goto eRR;}
3759 if(!(val & AVR32_FLASHC_FSR_RDY)) {lineno = __LINE__; goto eRR;}
3760 if(err & AVR32_FLASHC_FSR_ERR) {lineno = __LINE__; goto eRR;}
3761
3762 return 0;
3763
3764 eRR:
3765 avrdude_message(MSG_INFO, "%s: jtagmkII_flash_write_page32(): "
3766 "failed at line %d page %d cmd %8.8lx val %lx\n",
3767 progname, lineno, page, cmd, val);
3768 return -1;
3769}
#define AVR32_FLASHC_FCMD_WRITE_PAGE
Definition jtagmkII_private.h:272

References AVR32_FLASHC_FCMD, AVR32_FLASHC_FCMD_KEY, AVR32_FLASHC_FCMD_WRITE_PAGE, AVR32_FLASHC_FSR, AVR32_FLASHC_FSR_ERR, AVR32_FLASHC_FSR_RDY, avrdude_message(), cmd, ERROR_SAB, jtagmkII_read_SABaddr(), jtagmkII_write_SABaddr(), lineno, MSG_INFO, pgm, and progname.

Referenced by jtagmkII_paged_write32().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_get_baud()

static unsigned char jtagmkII_get_baud ( long  baud)
static
1250{
1251 static struct {
1252 long baud;
1253 unsigned char val;
1254 } baudtab[] = {
1255 { 2400L, PAR_BAUD_2400 },
1256 { 4800L, PAR_BAUD_4800 },
1257 { 9600L, PAR_BAUD_9600 },
1258 { 19200L, PAR_BAUD_19200 },
1259 { 38400L, PAR_BAUD_38400 },
1260 { 57600L, PAR_BAUD_57600 },
1261 { 115200L, PAR_BAUD_115200 },
1262 { 14400L, PAR_BAUD_14400 },
1263 };
1264 int i;
1265
1266 for (i = 0; i < sizeof baudtab / sizeof baudtab[0]; i++)
1267 if (baud == baudtab[i].baud)
1268 return baudtab[i].val;
1269
1270 return 0;
1271}
static const struct @5 baudtab[]
#define PAR_BAUD_4800
Definition jtagmkII_private.h:202
#define PAR_BAUD_57600
Definition jtagmkII_private.h:206
#define PAR_BAUD_14400
Definition jtagmkII_private.h:208
#define PAR_BAUD_115200
Definition jtagmkII_private.h:207
#define PAR_BAUD_19200
Definition jtagmkII_private.h:204
#define PAR_BAUD_2400
Definition jtagmkII_private.h:201
#define PAR_BAUD_38400
Definition jtagmkII_private.h:205
#define PAR_BAUD_9600
Definition jtagmkII_private.h:203

References baudtab, PAR_BAUD_115200, PAR_BAUD_14400, PAR_BAUD_19200, PAR_BAUD_2400, PAR_BAUD_38400, PAR_BAUD_4800, PAR_BAUD_57600, and PAR_BAUD_9600.

Referenced by jtagmkII_initialize().

+ Here is the caller graph for this function:

◆ jtagmkII_get_rc()

static const char * jtagmkII_get_rc ( unsigned int  rc)
static
251{
252 int i;
253 static char msg[50];
254
255 for (i = 0; i < sizeof jtagresults / sizeof jtagresults[0]; i++)
256 if (jtagresults[i].code == rc)
257 return jtagresults[i].descr;
258
259 sprintf(msg, "Unknown JTAG ICE mkII result code 0x%02x", rc);
260 return msg;
261}
static struct @15 jtagresults[]

References jtagresults.

Referenced by jtagmkII_chip_erase(), jtagmkII_close(), jtagmkII_close32(), jtagmkII_getparm(), jtagmkII_getsync(), jtagmkII_page_erase(), jtagmkII_paged_load(), jtagmkII_paged_load32(), jtagmkII_paged_write(), jtagmkII_paged_write32(), jtagmkII_program_disable(), jtagmkII_program_enable(), jtagmkII_read_byte(), jtagmkII_reset(), jtagmkII_set_devdescr(), jtagmkII_set_xmega_params(), jtagmkII_setparm(), and jtagmkII_write_byte().

+ Here is the caller graph for this function:

◆ jtagmkII_getparm()

int jtagmkII_getparm ( PROGRAMMER pgm,
unsigned char  parm,
unsigned char *  value 
)
2549{
2550 int status;
2551 unsigned char buf[2], *resp, c;
2552
2553 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_getparm()\n", progname);
2554
2555 buf[0] = CMND_GET_PARAMETER;
2556 buf[1] = parm;
2557 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_getparm(): "
2558 "Sending get parameter command (parm 0x%02x): ",
2559 progname, parm);
2560 jtagmkII_send(pgm, buf, 2);
2561
2562 status = jtagmkII_recv(pgm, &resp);
2563 if (status <= 0) {
2564 if (verbose >= 2)
2565 putc('\n', stderr);
2566 avrdude_message(MSG_INFO, "%s: jtagmkII_getparm(): "
2567 "timeout/error communicating with programmer (status %d)\n",
2568 progname, status);
2569 return -1;
2570 }
2571 if (verbose >= 3) {
2572 putc('\n', stderr);
2573 jtagmkII_prmsg(pgm, resp, status);
2574 } else if (verbose == 2)
2575 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
2576 c = resp[0];
2577 if (c != RSP_PARAMETER) {
2578 avrdude_message(MSG_INFO, "%s: jtagmkII_getparm(): "
2579 "bad response to get parameter command: %s\n",
2581 free(resp);
2582 return -1;
2583 }
2584
2585 memcpy(value, resp + 1, 4);
2586 free(resp);
2587
2588 return 0;
2589}
#define RSP_PARAMETER
Definition jtagmkII_private.h:118
#define CMND_GET_PARAMETER
Definition jtagmkII_private.h:80

References avrdude_message(), CMND_GET_PARAMETER, free(), jtagmkII_get_rc(), jtagmkII_prmsg(), jtagmkII_recv(), jtagmkII_send(), MSG_INFO, MSG_NOTICE2, pgm, progname, RSP_PARAMETER, and verbose.

Referenced by jtagmkII_display(), jtagmkII_print_parms1(), and jtagmkII_read_byte().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_getsync()

int jtagmkII_getsync ( PROGRAMMER pgm,
int  mode 
)
675 {
676 int tries;
677#define MAXTRIES 33
678 unsigned char buf[3], *resp, c = 0xff;
679 int status;
680 unsigned int fwver, hwver;
681 int is_dragon;
682
683 avrdude_message(MSG_DEBUG, "%s: jtagmkII_getsync()\n", progname);
684
685 if (strncmp(pgm->type, "JTAG", strlen("JTAG")) == 0) {
686 is_dragon = 0;
687 } else if (strncmp(pgm->type, "DRAGON", strlen("DRAGON")) == 0) {
688 is_dragon = 1;
689 } else {
690 avrdude_message(MSG_INFO, "%s: Programmer is neither JTAG ICE mkII nor AVR Dragon\n",
691 progname);
692 return -1;
693 }
694 for (tries = 0; tries < MAXTRIES; tries++) {
695
696 /* Get the sign-on information. */
697 buf[0] = CMND_GET_SIGN_ON;
698 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_getsync(): Sending sign-on command: ",
699 progname);
700 jtagmkII_send(pgm, buf, 1);
701
702 status = jtagmkII_recv(pgm, &resp);
703 if (status <= 0) {
704 avrdude_message(MSG_INFO, "%s: jtagmkII_getsync(): sign-on command: "
705 "status %d\n",
706 progname, status);
707 } else if (verbose >= 3) {
708 putc('\n', stderr);
709 jtagmkII_prmsg(pgm, resp, status);
710 } else if (verbose == 2)
711 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
712
713 if (status > 0) {
714 if ((c = resp[0]) == RSP_SIGN_ON) {
715 fwver = ((unsigned)resp[8] << 8) | (unsigned)resp[7];
716 PDATA(pgm)->fwver = fwver;
717 hwver = (unsigned)resp[9];
718 memcpy(PDATA(pgm)->serno, resp + 10, 6);
719 if (status > 17) {
720 avrdude_message(MSG_NOTICE, "JTAG ICE mkII sign-on message:\n");
721 avrdude_message(MSG_NOTICE, "Communications protocol version: %u\n",
722 (unsigned)resp[1]);
723 avrdude_message(MSG_NOTICE, "M_MCU:\n");
724 avrdude_message(MSG_NOTICE, " boot-loader FW version: %u\n",
725 (unsigned)resp[2]);
726 avrdude_message(MSG_NOTICE, " firmware version: %u.%02u\n",
727 (unsigned)resp[4], (unsigned)resp[3]);
728 avrdude_message(MSG_NOTICE, " hardware version: %u\n",
729 (unsigned)resp[5]);
730 avrdude_message(MSG_NOTICE, "S_MCU:\n");
731 avrdude_message(MSG_NOTICE, " boot-loader FW version: %u\n",
732 (unsigned)resp[6]);
733 avrdude_message(MSG_NOTICE, " firmware version: %u.%02u\n",
734 (unsigned)resp[8], (unsigned)resp[7]);
735 avrdude_message(MSG_NOTICE, " hardware version: %u\n",
736 (unsigned)resp[9]);
737 avrdude_message(MSG_NOTICE, "Serial number: "
738 "%02x:%02x:%02x:%02x:%02x:%02x\n",
739 PDATA(pgm)->serno[0], PDATA(pgm)->serno[1], PDATA(pgm)->serno[2], PDATA(pgm)->serno[3], PDATA(pgm)->serno[4], PDATA(pgm)->serno[5]);
740 resp[status - 1] = '\0';
741 avrdude_message(MSG_NOTICE, "Device ID: %s\n",
742 resp + 16);
743 }
744 break;
745 }
746 free(resp);
747 }
748 }
749 if (tries >= MAXTRIES) {
750 if (status <= 0)
751 avrdude_message(MSG_INFO, "%s: jtagmkII_getsync(): "
752 "timeout/error communicating with programmer (status %d)\n",
753 progname, status);
754 else
755 avrdude_message(MSG_INFO, "%s: jtagmkII_getsync(): "
756 "bad response to sign-on command: %s\n",
758 return -1;
759 }
760
761 PDATA(pgm)->device_descriptor_length = sizeof(struct device_descriptor);
762 /*
763 * There's no official documentation from Atmel about what firmware
764 * revision matches what device descriptor length. The algorithm
765 * below has been found empirically.
766 */
767#define FWVER(maj, min) ((maj << 8) | (min))
768 if (!is_dragon && fwver < FWVER(3, 16)) {
769 PDATA(pgm)->device_descriptor_length -= 2;
770 avrdude_message(MSG_INFO, "%s: jtagmkII_getsync(): "
771 "S_MCU firmware version might be too old to work correctly\n",
772 progname);
773 } else if (!is_dragon && fwver < FWVER(4, 0)) {
774 PDATA(pgm)->device_descriptor_length -= 2;
775 }
776 if (mode != EMULATOR_MODE_SPI)
777 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_getsync(): Using a %u-byte device descriptor\n",
778 progname, (unsigned)PDATA(pgm)->device_descriptor_length);
779 if (mode == EMULATOR_MODE_SPI) {
780 PDATA(pgm)->device_descriptor_length = 0;
781 if (!is_dragon && fwver < FWVER(4, 14)) {
782 avrdude_message(MSG_INFO, "%s: jtagmkII_getsync(): ISP functionality requires firmware "
783 "version >= 4.14\n",
784 progname);
785 return -1;
786 }
787 }
788 if (mode == EMULATOR_MODE_PDI || mode == EMULATOR_MODE_JTAG_XMEGA) {
789 if (!is_dragon && mode == EMULATOR_MODE_PDI && hwver < 1) {
790 avrdude_message(MSG_INFO, "%s: jtagmkII_getsync(): Xmega PDI support requires hardware "
791 "revision >= 1\n",
792 progname);
793 return -1;
794 }
795 if (!is_dragon && fwver < FWVER(5, 37)) {
796 avrdude_message(MSG_INFO, "%s: jtagmkII_getsync(): Xmega support requires firmware "
797 "version >= 5.37\n",
798 progname);
799 return -1;
800 }
801 if (is_dragon && fwver < FWVER(6, 11)) {
802 avrdude_message(MSG_INFO, "%s: jtagmkII_getsync(): Xmega support requires firmware "
803 "version >= 6.11\n",
804 progname);
805 return -1;
806 }
807 }
808#undef FWVER
809
810 if(mode < 0) return 0; // for AVR32
811
812 tries = 0;
813retry:
814 /* Turn the ICE into JTAG or ISP mode as requested. */
815 buf[0] = mode;
816 if (jtagmkII_setparm(pgm, PAR_EMULATOR_MODE, buf) < 0) {
817 if (mode == EMULATOR_MODE_SPI) {
818 avrdude_message(MSG_INFO, "%s: jtagmkII_getsync(): "
819 "ISP activation failed, trying debugWire\n",
820 progname);
823 return -1;
824 else {
825 /*
826 * We are supposed to send a CMND_RESET with the
827 * MONCOM_DISABLE flag set right now, and then
828 * restart from scratch.
829 *
830 * As this will make the ICE sign off from USB, so
831 * we risk losing our USB connection, it's easier
832 * to instruct the user to restart AVRDUDE rather
833 * than trying to cope with all this inside the
834 * program.
835 */
836 (void)jtagmkII_reset(pgm, 0x04);
837 if (tries++ > 3) {
838 avrdude_message(MSG_INFO, "%s: Failed to return from debugWIRE to ISP.\n",
839 progname);
840 return -1;
841 }
842 avrdude_message(MSG_INFO, "%s: Target prepared for ISP, signed off.\n"
843 "%s: Now retrying without power-cycling the target.\n",
845 goto retry;
846 }
847 } else {
848 return -1;
849 }
850 }
851
852 /* GET SYNC forces the target into STOPPED mode */
853 buf[0] = CMND_GET_SYNC;
854 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_getsync(): Sending get sync command: ",
855 progname);
856 jtagmkII_send(pgm, buf, 1);
857
858 status = jtagmkII_recv(pgm, &resp);
859 if (status <= 0) {
860 if (verbose >= 2)
861 putc('\n', stderr);
862 avrdude_message(MSG_INFO, "%s: jtagmkII_getsync(): "
863 "timeout/error communicating with programmer (status %d)\n",
864 progname, status);
865 return -1;
866 }
867 if (verbose >= 3) {
868 putc('\n', stderr);
869 jtagmkII_prmsg(pgm, resp, status);
870 } else if (verbose == 2)
871 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
872 c = resp[0];
873 free(resp);
874 if (c != RSP_OK) {
875 avrdude_message(MSG_INFO, "%s: jtagmkII_getsync(): "
876 "bad response to set parameter command: %s\n",
878 return -1;
879 }
880
881 return 0;
882}
#define MSG_DEBUG
Definition avrdude.h:54
static int jtagmkII_reset(PROGRAMMER *pgm, unsigned char flags)
Definition jtagmkII.c:1098
#define MAXTRIES
#define FWVER(maj, min)
static int jtagmkII_setparm(PROGRAMMER *pgm, unsigned char parm, unsigned char *value)
Definition jtagmkII.c:2594
#define EMULATOR_MODE_JTAG_XMEGA
Definition jtagmkII_private.h:197
#define PAR_EMULATOR_MODE
Definition jtagmkII_private.h:191
#define RSP_SIGN_ON
Definition jtagmkII_private.h:123
#define CMND_GET_SIGN_ON
Definition jtagmkII_private.h:78
#define EMULATOR_MODE_SPI
Definition jtagmkII_private.h:195
#define CMND_GET_SYNC
Definition jtagmkII_private.h:91
Definition jtagmkI_private.h:149
IGL_INLINE void mode(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &X, const int d, Eigen::Matrix< T, Eigen::Dynamic, 1 > &M)
Definition mode.cpp:14

References avrdude_message(), CMND_GET_SIGN_ON, CMND_GET_SYNC, EMULATOR_MODE_DEBUGWIRE, EMULATOR_MODE_JTAG_XMEGA, EMULATOR_MODE_PDI, EMULATOR_MODE_SPI, free(), FWVER, jtagmkII_get_rc(), jtagmkII_prmsg(), jtagmkII_recv(), jtagmkII_reset(), jtagmkII_send(), jtagmkII_setparm(), MAXTRIES, MSG_DEBUG, MSG_INFO, MSG_NOTICE, MSG_NOTICE2, PAR_EMULATOR_MODE, PDATA, pgm, progname, RSP_OK, RSP_SIGN_ON, programmer_t::type, verbose, and void().

Referenced by jtagmkII_dragon_open(), jtagmkII_dragon_open_dw(), jtagmkII_dragon_open_pdi(), jtagmkII_initialize(), jtagmkII_open(), jtagmkII_open32(), jtagmkII_open_dw(), and jtagmkII_open_pdi().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_initialize()

static int jtagmkII_initialize ( PROGRAMMER pgm,
AVRPART p 
)
static
1277{
1278 AVRMEM hfuse;
1279 unsigned char b;
1280 int ok;
1281 const char *ifname;
1282
1283 ok = 0;
1284 if (pgm->flag & PGM_FL_IS_DW) {
1285 ifname = "debugWire";
1286 if (p->flags & AVRPART_HAS_DW)
1287 ok = 1;
1288 } else if (pgm->flag & PGM_FL_IS_PDI) {
1289 ifname = "PDI";
1290 if (p->flags & AVRPART_HAS_PDI)
1291 ok = 1;
1292 } else {
1293 ifname = "JTAG";
1294 if (p->flags & AVRPART_HAS_JTAG)
1295 ok = 1;
1296 }
1297
1298 if (!ok) {
1299 avrdude_message(MSG_INFO, "%s: jtagmkII_initialize(): part %s has no %s interface\n",
1300 progname, p->desc, ifname);
1301 return -1;
1302 }
1303
1304 if ((serdev->flags & SERDEV_FL_CANSETSPEED) && pgm->baudrate && pgm->baudrate != 19200) {
1305 if ((b = jtagmkII_get_baud(pgm->baudrate)) == 0) {
1306 avrdude_message(MSG_INFO, "%s: jtagmkII_initialize(): unsupported baudrate %d\n",
1308 } else {
1309 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_initialize(): "
1310 "trying to set baudrate to %d\n",
1312 if (jtagmkII_setparm(pgm, PAR_BAUD_RATE, &b) == 0)
1314 }
1315 }
1316 if ((pgm->flag & PGM_FL_IS_JTAG) && pgm->bitclock != 0.0) {
1317 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_initialize(): "
1318 "trying to set JTAG clock period to %.1f us\n",
1321 return -1;
1322 }
1323
1324 if ((pgm->flag & PGM_FL_IS_JTAG) &&
1325 jtagmkII_setparm(pgm, PAR_DAISY_CHAIN_INFO, PDATA(pgm)->jtagchain) < 0) {
1326 avrdude_message(MSG_INFO, "%s: jtagmkII_initialize(): Failed to setup JTAG chain\n",
1327 progname);
1328 return -1;
1329 }
1330
1331 /*
1332 * If this is an ATxmega device in JTAG mode, change the emulator
1333 * mode from JTAG to JTAG_XMEGA.
1334 */
1335 if ((pgm->flag & PGM_FL_IS_JTAG) &&
1336 (p->flags & AVRPART_HAS_PDI)) {
1338 return -1;
1339 }
1340 /*
1341 * Must set the device descriptor before entering programming mode.
1342 */
1343 if (PDATA(pgm)->fwver >= 0x700 && (p->flags & AVRPART_HAS_PDI) != 0)
1345 else
1347
1348 PDATA(pgm)->boot_start = ULONG_MAX;
1349 /*
1350 * If this is an ATxmega device in JTAG mode, change the emulator
1351 * mode from JTAG to JTAG_XMEGA.
1352 */
1353 if ((pgm->flag & PGM_FL_IS_JTAG) &&
1354 (p->flags & AVRPART_HAS_PDI)) {
1355 /*
1356 * Find out where the border between application and boot area
1357 * is.
1358 */
1359 AVRMEM *bootmem = avr_locate_mem(p, "boot");
1360 AVRMEM *flashmem = avr_locate_mem(p, "flash");
1361 if (bootmem == NULL || flashmem == NULL) {
1362 avrdude_message(MSG_INFO, "%s: jtagmkII_initialize(): Cannot locate \"flash\" and \"boot\" memories in description\n",
1363 progname);
1364 } else {
1365 if (PDATA(pgm)->fwver < 0x700) {
1366 /* V7+ firmware does not need this anymore */
1367 unsigned char par[4];
1368
1369 u32_to_b4(par, flashmem->offset);
1371 u32_to_b4(par, bootmem->offset);
1373 }
1374
1375 PDATA(pgm)->boot_start = bootmem->offset - flashmem->offset;
1376 }
1377 }
1378
1379 free(PDATA(pgm)->flash_pagecache);
1380 free(PDATA(pgm)->eeprom_pagecache);
1381 if ((PDATA(pgm)->flash_pagecache = malloc(PDATA(pgm)->flash_pagesize)) == NULL) {
1382 avrdude_message(MSG_INFO, "%s: jtagmkII_initialize(): Out of memory\n",
1383 progname);
1384 return -1;
1385 }
1386 if ((PDATA(pgm)->eeprom_pagecache = malloc(PDATA(pgm)->eeprom_pagesize)) == NULL) {
1387 avrdude_message(MSG_INFO, "%s: jtagmkII_initialize(): Out of memory\n",
1388 progname);
1389 free(PDATA(pgm)->flash_pagecache);
1390 return -1;
1391 }
1392 PDATA(pgm)->flash_pageaddr = PDATA(pgm)->eeprom_pageaddr = (unsigned long)-1L;
1393
1394 if (PDATA(pgm)->fwver >= 0x700 && (p->flags & AVRPART_HAS_PDI)) {
1395 /*
1396 * Work around for
1397 * https://savannah.nongnu.org/bugs/index.php?37942
1398 *
1399 * Firmware version 7.24 (at least) on the Dragon behaves very
1400 * strange when it gets a RESET request here. All subsequent
1401 * responses are completely off, so the emulator becomes unusable.
1402 * This appears to be a firmware bug (earlier versions, at least
1403 * 7.14, didn't experience this), but by omitting the RESET for
1404 * Xmega devices, we can work around it.
1405 */
1406 } else {
1407 if (jtagmkII_reset(pgm, 0x01) < 0)
1408 return -1;
1409 }
1410
1411 if ((pgm->flag & PGM_FL_IS_JTAG) && !(p->flags & AVRPART_HAS_PDI)) {
1412 strcpy(hfuse.desc, "hfuse");
1413 if (jtagmkII_read_byte(pgm, p, &hfuse, 1, &b) < 0)
1414 return -1;
1415 if ((b & OCDEN) != 0)
1416 avrdude_message(MSG_INFO, "%s: jtagmkII_initialize(): warning: OCDEN fuse not programmed, "
1417 "single-byte EEPROM updates not possible\n",
1418 progname);
1419 }
1420
1421 return 0;
1422}
AVRMEM * avr_locate_mem(AVRPART *p, char *desc)
Definition avrpart.c:354
void * malloc(YYSIZE_T)
#define OCDEN
Definition jtagmkII.c:99
static unsigned char jtagmkII_get_baud(long baud)
Definition jtagmkII.c:1249
static void u32_to_b4(unsigned char *b, unsigned long l)
Definition jtagmkII.c:216
static void jtagmkII_set_devdescr(PROGRAMMER *pgm, AVRPART *p)
Definition jtagmkII.c:947
static void jtagmkII_set_xmega_params(PROGRAMMER *pgm, AVRPART *p)
Definition jtagmkII.c:1018
#define PAR_PDI_OFFSET_END
Definition jtagmkII_private.h:239
#define PAR_DAISY_CHAIN_INFO
Definition jtagmkII_private.h:233
#define PAR_BAUD_RATE
Definition jtagmkII_private.h:200
#define PAR_PDI_OFFSET_START
Definition jtagmkII_private.h:238
#define serial_setspeed
Definition libavrdude.h:575
#define AVRPART_HAS_JTAG
Definition libavrdude.h:198
unsigned int offset
Definition libavrdude.h:289
char desc[AVR_DESCLEN]
Definition libavrdude.h:218
#define AVRPART_HAS_DW
Definition libavrdude.h:201
#define SERDEV_FL_CANSETSPEED
Definition libavrdude.h:564
char desc[AVR_MEMDESCLEN]
Definition libavrdude.h:284
Definition libavrdude.h:283
double bitclock
Definition libavrdude.h:635
int baudrate
Definition libavrdude.h:630
int flags
Definition libavrdude.h:562
wchar_t const wchar_t unsigned long
Definition windows.hpp:29

References avr_locate_mem(), avrdude_message(), AVRPART_HAS_DW, AVRPART_HAS_JTAG, AVRPART_HAS_PDI, programmer_t::baudrate, programmer_t::bitclock, avrpart::desc, avrmem::desc, EMULATOR_MODE_JTAG_XMEGA, programmer_t::fd, programmer_t::flag, avrpart::flags, serial_device::flags, free(), jtagmkII_get_baud(), jtagmkII_getsync(), jtagmkII_read_byte(), jtagmkII_reset(), jtagmkII_set_devdescr(), jtagmkII_set_sck_period(), jtagmkII_set_xmega_params(), jtagmkII_setparm(), long, malloc(), MSG_INFO, MSG_NOTICE2, OCDEN, avrmem::offset, PAR_BAUD_RATE, PAR_DAISY_CHAIN_INFO, PAR_PDI_OFFSET_END, PAR_PDI_OFFSET_START, PDATA, pgm, PGM_FL_IS_DW, PGM_FL_IS_JTAG, PGM_FL_IS_PDI, progname, serdev, SERDEV_FL_CANSETSPEED, serial_setspeed, u32_to_b4(), and void().

Referenced by jtagmkII_dragon_dw_initpgm(), jtagmkII_dragon_initpgm(), jtagmkII_dragon_pdi_initpgm(), jtagmkII_dw_initpgm(), jtagmkII_initpgm(), and jtagmkII_pdi_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_initialize32()

static int jtagmkII_initialize32 ( PROGRAMMER pgm,
AVRPART p 
)
static
3100{
3101 int status, j;
3102 unsigned char buf[6], *resp;
3103
3104 if (jtagmkII_setparm(pgm, PAR_DAISY_CHAIN_INFO, PDATA(pgm)->jtagchain) < 0) {
3105 avrdude_message(MSG_INFO, "%s: jtagmkII_initialize(): Failed to setup JTAG chain\n",
3106 progname);
3107 return -1;
3108 }
3109
3110 free(PDATA(pgm)->flash_pagecache);
3111 free(PDATA(pgm)->eeprom_pagecache);
3112 if ((PDATA(pgm)->flash_pagecache = malloc(PDATA(pgm)->flash_pagesize)) == NULL) {
3113 avrdude_message(MSG_INFO, "%s: jtagmkII_initialize(): Out of memory\n",
3114 progname);
3115 return -1;
3116 }
3117 if ((PDATA(pgm)->eeprom_pagecache = malloc(PDATA(pgm)->eeprom_pagesize)) == NULL) {
3118 avrdude_message(MSG_INFO, "%s: jtagmkII_initialize32(): Out of memory\n",
3119 progname);
3120 free(PDATA(pgm)->flash_pagecache);
3121 return -1;
3122 }
3123 PDATA(pgm)->flash_pageaddr = PDATA(pgm)->eeprom_pageaddr = (unsigned long)-1L;
3124
3125 for(j=0; j<2; ++j) {
3126 buf[0] = CMND_GET_IR;
3127 buf[1] = 0x1;
3128 if(jtagmkII_send(pgm, buf, 2) < 0)
3129 return -1;
3130 status = jtagmkII_recv(pgm, &resp);
3131 if(status <= 0 || resp[0] != 0x87) {
3132 if (verbose >= 2)
3133 putc('\n', stderr);
3134 avrdude_message(MSG_INFO, "%s: jtagmkII_initialize32(): "
3135 "timeout/error communicating with programmer (status %d)\n",
3136 progname, status);
3137 return -1;
3138 }
3139 free(resp);
3140
3141 memset(buf, 0, sizeof(buf));
3142 buf[0] = CMND_GET_xxx;
3143 buf[1] = 0x20;
3144 if(jtagmkII_send(pgm, buf, 6) < 0)
3145 return -1;
3146 status = jtagmkII_recv(pgm, &resp);
3147 if(status <= 0 || resp[0] != 0x87) {
3148 if (verbose >= 2)
3149 putc('\n', stderr);
3150 avrdude_message(MSG_INFO, "%s: jtagmkII_initialize32(): "
3151 "timeout/error communicating with programmer (status %d)\n",
3152 progname, status);
3153 return -1;
3154 }
3155
3156 if (status != 5 ||
3157 resp[2] != p->signature[0] ||
3158 resp[3] != p->signature[1] ||
3159 resp[4] != p->signature[2]) {
3160 avrdude_message(MSG_INFO, "%s: Expected signature for %s is %02X %02X %02X\n",
3161 progname, p->desc,
3162 p->signature[0], p->signature[1], p->signature[2]);
3163 if (!ovsigck) {
3164 avrdude_message(MSG_INFO, "%sDouble check chip, "
3165 "or use -F to override this check.\n",
3166 progbuf);
3167 return -1;
3168 }
3169 }
3170 free(resp);
3171 }
3172
3173 return 0;
3174}
int ovsigck
Definition main.c:200
char progbuf[]
Definition main.c:62
unsigned char signature[3]
Definition libavrdude.h:225

References avrdude_message(), CMND_GET_IR, CMND_GET_xxx, avrpart::desc, free(), jtagmkII_recv(), jtagmkII_send(), jtagmkII_setparm(), long, malloc(), MSG_INFO, ovsigck, PAR_DAISY_CHAIN_INFO, PDATA, pgm, progbuf, progname, avrpart::signature, and verbose.

Referenced by jtagmkII_avr32_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_initpgm()

void jtagmkII_initpgm ( PROGRAMMER pgm)
3807{
3808 strcpy(pgm->type, "JTAGMKII");
3809
3810 /*
3811 * mandatory functions
3812 */
3823
3824 /*
3825 * optional functions
3826 */
3835 pgm->page_size = 256;
3837}
static int jtagmkII_open(PROGRAMMER *pgm, char *port)
Definition jtagmkII.c:1484

References programmer_t::chip_erase, programmer_t::close, programmer_t::disable, programmer_t::display, programmer_t::enable, programmer_t::flag, programmer_t::initialize, jtagmkII_chip_erase(), jtagmkII_close(), jtagmkII_disable(), jtagmkII_display(), jtagmkII_enable(), jtagmkII_initialize(), jtagmkII_open(), jtagmkII_page_erase(), jtagmkII_paged_load(), jtagmkII_paged_write(), jtagmkII_parseextparms(), jtagmkII_print_parms(), jtagmkII_program_enable_INFO(), jtagmkII_read_byte(), jtagmkII_set_sck_period(), jtagmkII_setup(), jtagmkII_teardown(), jtagmkII_write_byte(), programmer_t::open, programmer_t::page_erase, programmer_t::page_size, programmer_t::paged_load, programmer_t::paged_write, programmer_t::parseextparams, pgm, PGM_FL_IS_JTAG, programmer_t::print_parms, programmer_t::program_enable, programmer_t::read_byte, programmer_t::set_sck_period, programmer_t::setup, programmer_t::teardown, programmer_t::type, and programmer_t::write_byte.

+ Here is the call graph for this function:

◆ jtagmkII_memaddr()

static unsigned int jtagmkII_memaddr ( PROGRAMMER pgm,
AVRPART p,
AVRMEM m,
unsigned long  addr 
)
static
2736{
2737 /*
2738 * Xmega devices handled by V7+ firmware don't want to be told their
2739 * m->offset within the write memory command.
2740 */
2741 if (PDATA(pgm)->fwver >= 0x700 && (p->flags & AVRPART_HAS_PDI) != 0) {
2742 if (addr >= PDATA(pgm)->boot_start)
2743 /*
2744 * all memories but "flash" are smaller than boot_start anyway, so
2745 * no need for an extra check we are operating on "flash"
2746 */
2747 return addr - PDATA(pgm)->boot_start;
2748 else
2749 /* normal flash, or anything else */
2750 return addr;
2751 }
2752 /*
2753 * Old firmware, or non-Xmega device. Non-Xmega (and non-AVR32)
2754 * devices always have an m->offset of 0, so we don't have to
2755 * distinguish them here.
2756 */
2757 return addr + m->offset;
2758}

References AVRPART_HAS_PDI, avrpart::flags, avrmem::offset, PDATA, and pgm.

Referenced by jtagmkII_paged_load(), and jtagmkII_paged_write().

+ Here is the caller graph for this function:

◆ jtagmkII_memtype()

static unsigned char jtagmkII_memtype ( PROGRAMMER pgm,
AVRPART p,
unsigned long  addr 
)
static
2724{
2725 if ( p->flags & AVRPART_HAS_PDI ) {
2726 if (addr >= PDATA(pgm)->boot_start)
2727 return MTYPE_BOOT_FLASH;
2728 else
2729 return MTYPE_FLASH;
2730 } else {
2731 return MTYPE_FLASH_PAGE;
2732 }
2733}
#define MTYPE_BOOT_FLASH
Definition jtag3_private.h:164
#define MTYPE_FLASH_PAGE
Definition jtag3_private.h:157
#define MTYPE_FLASH
Definition jtag3_private.h:163

References AVRPART_HAS_PDI, avrpart::flags, MTYPE_BOOT_FLASH, MTYPE_FLASH, MTYPE_FLASH_PAGE, PDATA, and pgm.

Referenced by jtagmkII_page_erase(), jtagmkII_paged_load(), and jtagmkII_paged_write().

+ Here is the caller graph for this function:

◆ jtagmkII_open()

static int jtagmkII_open ( PROGRAMMER pgm,
char *  port 
)
static
1485{
1486 union pinfo pinfo;
1487
1488 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_open()\n", progname);
1489
1490 /*
1491 * The JTAG ICE mkII always starts with a baud rate of 19200 Bd upon
1492 * attaching. If the config file or command-line parameters specify
1493 * a higher baud rate, we switch to it later on, after establishing
1494 * the connection with the ICE.
1495 */
1496 pinfo.baud = 19200;
1497
1498 /*
1499 * If the port name starts with "usb", divert the serial routines
1500 * to the USB ones. The serial_open() function for USB overrides
1501 * the meaning of the "baud" parameter to be the USB device ID to
1502 * search for.
1503 */
1504 if (strncmp(port, "usb", 3) == 0) {
1505#if defined(HAVE_LIBUSB)
1506 serdev = &usb_serdev;
1508 pinfo.usbinfo.flags = 0;
1510 pgm->fd.usb.max_xfer = USBDEV_MAX_XFER_MKII;
1513 pgm->fd.usb.eep = 0; /* no seperate EP for events */
1514#else
1515 avrdude_message(MSG_INFO, "avrdude was compiled without usb support.\n");
1516 return -1;
1517#endif
1518 }
1519
1520 strcpy(pgm->port, port);
1521 if (serial_open(port, pinfo, &pgm->fd)==-1) {
1522 return -1;
1523 }
1524
1525 /*
1526 * drain any extraneous input
1527 */
1528 jtagmkII_drain(pgm, 0);
1529
1531 serial_close(&pgm->fd);
1532 return -1;
1533 }
1534
1535 return 0;
1536}
#define USB_DEVICE_JTAGICEMKII
Definition usbdevs.h:29

References avrdude_message(), pinfo::baud, EMULATOR_MODE_JTAG, programmer_t::fd, jtagmkII_drain(), jtagmkII_getsync(), MSG_INFO, MSG_NOTICE2, pgm, programmer_t::port, progname, serdev, serial_close, serial_open, filedescriptor::usb, USB_DEVICE_JTAGICEMKII, usb_serdev, USB_VENDOR_ATMEL, USBDEV_BULK_EP_READ_MKII, USBDEV_BULK_EP_WRITE_MKII, USBDEV_MAX_XFER_MKII, and pinfo::usbinfo.

Referenced by jtagmkII_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_open32()

static int jtagmkII_open32 ( PROGRAMMER pgm,
char *  port 
)
static
3335{
3336 int status;
3337 unsigned char buf[6], *resp;
3338 union pinfo pinfo;
3339
3340 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_open32()\n", progname);
3341
3342 /*
3343 * The JTAG ICE mkII always starts with a baud rate of 19200 Bd upon
3344 * attaching. If the config file or command-line parameters specify
3345 * a higher baud rate, we switch to it later on, after establishing
3346 * the connection with the ICE.
3347 */
3348 pinfo.baud = 19200;
3349
3350 /*
3351 * If the port name starts with "usb", divert the serial routines
3352 * to the USB ones. The serial_open() function for USB overrides
3353 * the meaning of the "baud" parameter to be the USB device ID to
3354 * search for.
3355 */
3356 if (strncmp(port, "usb", 3) == 0) {
3357#if defined(HAVE_LIBUSB)
3358 serdev = &usb_serdev;
3360 pinfo.usbinfo.flags = 0;
3362 pgm->fd.usb.max_xfer = USBDEV_MAX_XFER_MKII;
3365 pgm->fd.usb.eep = 0; /* no seperate EP for events */
3366#else
3367 avrdude_message(MSG_INFO, "avrdude was compiled without usb support.\n");
3368 return -1;
3369#endif
3370 }
3371
3372 strcpy(pgm->port, port);
3373 if (serial_open(port, pinfo, &pgm->fd)==-1) {
3374 return -1;
3375 }
3376
3377 /*
3378 * drain any extraneous input
3379 */
3380 jtagmkII_drain(pgm, 0);
3381
3382 status = jtagmkII_getsync(pgm, -1);
3383 if(status < 0) return -1;
3384
3385 // FIXME: Error handling is bad here: memory leak in resp (?) and port not closed
3386
3387 // AVR32 "special"
3388 buf[0] = CMND_SET_PARAMETER;
3389 buf[1] = 0x2D;
3390 buf[2] = 0x03;
3391 jtagmkII_send(pgm, buf, 3);
3392 status = jtagmkII_recv(pgm, &resp);
3393 if(status < 0 || resp[0] != RSP_OK)
3394 return -1;
3395 free(resp);
3396
3397 buf[1] = 0x03;
3398 buf[2] = 0x02;
3399 jtagmkII_send(pgm, buf, 3);
3400 status = jtagmkII_recv(pgm, &resp);
3401 if(status < 0 || resp[0] != RSP_OK)
3402 return -1;
3403 free(resp);
3404
3405 buf[1] = 0x03;
3406 buf[2] = 0x04;
3407 jtagmkII_send(pgm, buf, 3);
3408 status = jtagmkII_recv(pgm, &resp);
3409 if(status < 0 || resp[0] != RSP_OK)
3410 return -1;
3411 free(resp);
3412
3413 return 0;
3414}

References avrdude_message(), pinfo::baud, CMND_SET_PARAMETER, programmer_t::fd, free(), jtagmkII_drain(), jtagmkII_getsync(), jtagmkII_recv(), jtagmkII_send(), MSG_INFO, MSG_NOTICE2, pgm, programmer_t::port, progname, RSP_OK, serdev, serial_open, filedescriptor::usb, USB_DEVICE_JTAGICEMKII, usb_serdev, USB_VENDOR_ATMEL, USBDEV_BULK_EP_READ_MKII, USBDEV_BULK_EP_WRITE_MKII, USBDEV_MAX_XFER_MKII, and pinfo::usbinfo.

Referenced by jtagmkII_avr32_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_open_dw()

static int jtagmkII_open_dw ( PROGRAMMER pgm,
char *  port 
)
static
1539{
1540 union pinfo pinfo;
1541
1542 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_open_dw()\n", progname);
1543
1544 /*
1545 * The JTAG ICE mkII always starts with a baud rate of 19200 Bd upon
1546 * attaching. If the config file or command-line parameters specify
1547 * a higher baud rate, we switch to it later on, after establishing
1548 * the connection with the ICE.
1549 */
1550 pinfo.baud = 19200;
1551
1552 /*
1553 * If the port name starts with "usb", divert the serial routines
1554 * to the USB ones. The serial_open() function for USB overrides
1555 * the meaning of the "baud" parameter to be the USB device ID to
1556 * search for.
1557 */
1558 if (strncmp(port, "usb", 3) == 0) {
1559#if defined(HAVE_LIBUSB)
1560 serdev = &usb_serdev;
1562 pinfo.usbinfo.flags = 0;
1564 pgm->fd.usb.max_xfer = USBDEV_MAX_XFER_MKII;
1567 pgm->fd.usb.eep = 0; /* no seperate EP for events */
1568#else
1569 avrdude_message(MSG_INFO, "avrdude was compiled without usb support.\n");
1570 return -1;
1571#endif
1572 }
1573
1574 strcpy(pgm->port, port);
1575 if (serial_open(port, pinfo, &pgm->fd)==-1) {
1576 return -1;
1577 }
1578
1579 /*
1580 * drain any extraneous input
1581 */
1582 jtagmkII_drain(pgm, 0);
1583
1585 serial_close(&pgm->fd);
1586 return -1;
1587 }
1588
1589 return 0;
1590}

References avrdude_message(), pinfo::baud, EMULATOR_MODE_DEBUGWIRE, programmer_t::fd, jtagmkII_drain(), jtagmkII_getsync(), MSG_INFO, MSG_NOTICE2, pgm, programmer_t::port, progname, serdev, serial_close, serial_open, filedescriptor::usb, USB_DEVICE_JTAGICEMKII, usb_serdev, USB_VENDOR_ATMEL, USBDEV_BULK_EP_READ_MKII, USBDEV_BULK_EP_WRITE_MKII, USBDEV_MAX_XFER_MKII, and pinfo::usbinfo.

Referenced by jtagmkII_dw_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_open_pdi()

static int jtagmkII_open_pdi ( PROGRAMMER pgm,
char *  port 
)
static
1593{
1594 union pinfo pinfo;
1595
1596 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_open_pdi()\n", progname);
1597
1598 /*
1599 * The JTAG ICE mkII always starts with a baud rate of 19200 Bd upon
1600 * attaching. If the config file or command-line parameters specify
1601 * a higher baud rate, we switch to it later on, after establishing
1602 * the connection with the ICE.
1603 */
1604 pinfo.baud = 19200;
1605
1606 /*
1607 * If the port name starts with "usb", divert the serial routines
1608 * to the USB ones. The serial_open() function for USB overrides
1609 * the meaning of the "baud" parameter to be the USB device ID to
1610 * search for.
1611 */
1612 if (strncmp(port, "usb", 3) == 0) {
1613#if defined(HAVE_LIBUSB)
1614 serdev = &usb_serdev;
1616 pinfo.usbinfo.flags = 0;
1618 pgm->fd.usb.max_xfer = USBDEV_MAX_XFER_MKII;
1621 pgm->fd.usb.eep = 0; /* no seperate EP for events */
1622#else
1623 avrdude_message(MSG_INFO, "avrdude was compiled without usb support.\n");
1624 return -1;
1625#endif
1626 }
1627
1628 strcpy(pgm->port, port);
1629 if (serial_open(port, pinfo, &pgm->fd)==-1) {
1630 return -1;
1631 }
1632
1633 /*
1634 * drain any extraneous input
1635 */
1636 jtagmkII_drain(pgm, 0);
1637
1639 serial_close(&pgm->fd);
1640 return -1;
1641 }
1642
1643 return 0;
1644}

References avrdude_message(), pinfo::baud, EMULATOR_MODE_PDI, programmer_t::fd, jtagmkII_drain(), jtagmkII_getsync(), MSG_INFO, MSG_NOTICE2, pgm, programmer_t::port, progname, serdev, serial_close, serial_open, filedescriptor::usb, USB_DEVICE_JTAGICEMKII, usb_serdev, USB_VENDOR_ATMEL, USBDEV_BULK_EP_READ_MKII, USBDEV_BULK_EP_WRITE_MKII, USBDEV_MAX_XFER_MKII, and pinfo::usbinfo.

Referenced by jtagmkII_pdi_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_page_erase()

static int jtagmkII_page_erase ( PROGRAMMER pgm,
AVRPART p,
AVRMEM m,
unsigned int  addr 
)
static
1882{
1883 unsigned char cmd[6];
1884 unsigned char *resp;
1885 int status, tries;
1886 long otimeout = serial_recv_timeout;
1887
1888 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_page_erase(.., %s, 0x%x)\n",
1889 progname, m->desc, addr);
1890
1891 if (!(p->flags & AVRPART_HAS_PDI)) {
1892 avrdude_message(MSG_INFO, "%s: jtagmkII_page_erase: not an Xmega device\n",
1893 progname);
1894 return -1;
1895 }
1896 if ((pgm->flag & PGM_FL_IS_DW)) {
1897 avrdude_message(MSG_INFO, "%s: jtagmkII_page_erase: not applicable to debugWIRE\n",
1898 progname);
1899 return -1;
1900 }
1901
1903 return -1;
1904
1905 cmd[0] = CMND_XMEGA_ERASE;
1906 if (strcmp(m->desc, "flash") == 0) {
1907 if (jtagmkII_memtype(pgm, p, addr) == MTYPE_FLASH)
1909 else
1911 } else if (strcmp(m->desc, "eeprom") == 0) {
1913 } else if ( ( strcmp(m->desc, "usersig") == 0 ) ) {
1915 } else if ( ( strcmp(m->desc, "boot") == 0 ) ) {
1917 } else {
1919 }
1920 serial_recv_timeout = 100;
1921
1922 /*
1923 * Don't use jtagmkII_memaddr() here. While with all other
1924 * commands, firmware 7+ doesn't require the NVM offsets being
1925 * applied, the erase page commands make an exception, and do
1926 * require the NVM offsets as part of the (page) address.
1927 */
1928 u32_to_b4(cmd + 2, addr + m->offset);
1929
1930 tries = 0;
1931
1932 retry:
1933 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_page_erase(): "
1934 "Sending xmega erase command: ",
1935 progname);
1936 jtagmkII_send(pgm, cmd, sizeof cmd);
1937
1938 status = jtagmkII_recv(pgm, &resp);
1939 if (status <= 0) {
1940 if (verbose >= 2)
1941 putc('\n', stderr);
1942 avrdude_message(MSG_INFO, "%s: jtagmkII_page_erase(): "
1943 "timeout/error communicating with programmer (status %d)\n",
1944 progname, status);
1945 if (tries++ < 4) {
1947 goto retry;
1948 }
1949 avrdude_message(MSG_INFO, "%s: jtagmkII_page_erase(): fatal timeout/"
1950 "error communicating with programmer (status %d)\n",
1951 progname, status);
1952 serial_recv_timeout = otimeout;
1953 return -1;
1954 }
1955 if (verbose >= 3) {
1956 putc('\n', stderr);
1957 jtagmkII_prmsg(pgm, resp, status);
1958 } else if (verbose == 2)
1959 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
1960 if (resp[0] != RSP_OK) {
1961 avrdude_message(MSG_INFO, "%s: jtagmkII_page_erase(): "
1962 "bad response to xmega erase command: %s\n",
1963 progname, jtagmkII_get_rc(resp[0]));
1964 free(resp);
1965 serial_recv_timeout = otimeout;
1966 return -1;
1967 }
1968 free(resp);
1969
1970 serial_recv_timeout = otimeout;
1971
1972 return 0;
1973}
#define XMEGA_ERASE_EEPROM_PAGE
Definition jtag3_private.h:213
#define XMEGA_ERASE_BOOT_PAGE
Definition jtag3_private.h:212
#define XMEGA_ERASE_APP_PAGE
Definition jtag3_private.h:211
#define XMEGA_ERASE_USERSIG
Definition jtag3_private.h:214
static unsigned char jtagmkII_memtype(PROGRAMMER *pgm, AVRPART *p, unsigned long addr)
Definition jtagmkII.c:2723
static int jtagmkII_program_enable(PROGRAMMER *pgm)
Definition jtagmkII.c:1150
long serial_recv_timeout
Definition ser_posix.c:47

References avrdude_message(), AVRPART_HAS_PDI, cmd, CMND_XMEGA_ERASE, avrmem::desc, programmer_t::flag, avrpart::flags, free(), jtagmkII_get_rc(), jtagmkII_memtype(), jtagmkII_prmsg(), jtagmkII_program_enable(), jtagmkII_recv(), jtagmkII_send(), MSG_INFO, MSG_NOTICE2, MTYPE_FLASH, avrmem::offset, pgm, PGM_FL_IS_DW, progname, RSP_OK, serial_recv_timeout, u32_to_b4(), verbose, XMEGA_ERASE_APP_PAGE, XMEGA_ERASE_BOOT_PAGE, XMEGA_ERASE_EEPROM_PAGE, and XMEGA_ERASE_USERSIG.

Referenced by jtagmkII_dragon_initpgm(), jtagmkII_dragon_pdi_initpgm(), jtagmkII_initpgm(), and jtagmkII_pdi_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_paged_load()

static int jtagmkII_paged_load ( PROGRAMMER pgm,
AVRPART p,
AVRMEM m,
unsigned int  page_size,
unsigned int  addr,
unsigned int  n_bytes 
)
static
2113{
2114 unsigned int block_size;
2115 unsigned int maxaddr = addr + n_bytes;
2116 unsigned char cmd[10];
2117 unsigned char *resp;
2118 int status, tries, dynamic_memtype = 0;
2119 long otimeout = serial_recv_timeout;
2120
2121 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_paged_load(.., %s, %d, %d)\n",
2122 progname, m->desc, page_size, n_bytes);
2123
2125 return -1;
2126
2127 page_size = m->readsize;
2128
2129 cmd[0] = CMND_READ_MEMORY;
2130 if (strcmp(m->desc, "flash") == 0) {
2131 cmd[1] = jtagmkII_memtype(pgm, p, addr);
2132 if (p->flags & AVRPART_HAS_PDI)
2133 /* dynamically decide between flash/boot memtype */
2134 dynamic_memtype = 1;
2135 } else if (strcmp(m->desc, "eeprom") == 0) {
2137 if (pgm->flag & PGM_FL_IS_DW)
2138 return -1;
2139 } else if ( ( strcmp(m->desc, "prodsig") == 0 ) ) {
2140 cmd[1] = MTYPE_PRODSIG;
2141 } else if ( ( strcmp(m->desc, "usersig") == 0 ) ) {
2142 cmd[1] = MTYPE_USERSIG;
2143 } else if ( ( strcmp(m->desc, "boot") == 0 ) ) {
2144 cmd[1] = MTYPE_BOOT_FLASH;
2145 } else if ( p->flags & AVRPART_HAS_PDI ) {
2146 cmd[1] = MTYPE_FLASH;
2147 } else {
2148 cmd[1] = MTYPE_SPM;
2149 }
2150 serial_recv_timeout = 100;
2151 for (; addr < maxaddr; addr += page_size) {
2152 if ((maxaddr - addr) < page_size)
2153 block_size = maxaddr - addr;
2154 else
2155 block_size = page_size;
2156 avrdude_message(MSG_DEBUG, "%s: jtagmkII_paged_load(): "
2157 "block_size at addr %d is %d\n",
2158 progname, addr, block_size);
2159
2160 if (dynamic_memtype)
2161 cmd[1] = jtagmkII_memtype(pgm, p, addr);
2162
2163 u32_to_b4(cmd + 2, block_size);
2164 u32_to_b4(cmd + 6, jtagmkII_memaddr(pgm, p, m, addr));
2165
2166 tries = 0;
2167
2168 retry:
2169 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_paged_load(): Sending read memory command: ",
2170 progname);
2171 jtagmkII_send(pgm, cmd, 10);
2172
2173 status = jtagmkII_recv(pgm, &resp);
2174 if (status <= 0) {
2175 if (verbose >= 2)
2176 putc('\n', stderr);
2177 avrdude_message(MSG_INFO, "%s: jtagmkII_paged_load(): "
2178 "timeout/error communicating with programmer (status %d)\n",
2179 progname, status);
2180 if (tries++ < 4) {
2182 goto retry;
2183 }
2184 avrdude_message(MSG_INFO, "%s: jtagmkII_paged_load(): fatal timeout/"
2185 "error communicating with programmer (status %d)\n",
2186 progname, status);
2187 serial_recv_timeout = otimeout;
2188 return -1;
2189 }
2190 if (verbose >= 3) {
2191 putc('\n', stderr);
2192 jtagmkII_prmsg(pgm, resp, status);
2193 } else if (verbose == 2)
2194 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
2195 if (resp[0] != RSP_MEMORY) {
2196 avrdude_message(MSG_INFO, "%s: jtagmkII_paged_load(): "
2197 "bad response to read memory command: %s\n",
2198 progname, jtagmkII_get_rc(resp[0]));
2199 free(resp);
2200 serial_recv_timeout = otimeout;
2201 return -1;
2202 }
2203 memcpy(m->buf + addr, resp + 1, status-1);
2204 free(resp);
2205 }
2206 serial_recv_timeout = otimeout;
2207
2208 return n_bytes;
2209}
#define MTYPE_USERSIG
Definition jtag3_private.h:166
#define MTYPE_PRODSIG
Definition jtag3_private.h:167
#define MTYPE_EEPROM_PAGE
Definition jtag3_private.h:158
#define MTYPE_SPM
Definition jtag3_private.h:156
#define MTYPE_EEPROM
Definition jtag3_private.h:155
static unsigned int jtagmkII_memaddr(PROGRAMMER *pgm, AVRPART *p, AVRMEM *m, unsigned long addr)
Definition jtagmkII.c:2735
#define CMND_READ_MEMORY
Definition jtagmkII_private.h:82
#define RSP_MEMORY
Definition jtagmkII_private.h:119
unsigned char * buf
Definition libavrdude.h:304
int readsize
Definition libavrdude.h:301

References avrdude_message(), AVRPART_HAS_PDI, avrmem::buf, cmd, CMND_READ_MEMORY, avrmem::desc, programmer_t::flag, avrpart::flags, free(), jtagmkII_get_rc(), jtagmkII_memaddr(), jtagmkII_memtype(), jtagmkII_prmsg(), jtagmkII_program_enable(), jtagmkII_recv(), jtagmkII_send(), MSG_DEBUG, MSG_INFO, MSG_NOTICE2, MTYPE_BOOT_FLASH, MTYPE_EEPROM, MTYPE_EEPROM_PAGE, MTYPE_FLASH, MTYPE_PRODSIG, MTYPE_SPM, MTYPE_USERSIG, pgm, PGM_FL_IS_DW, progname, avrmem::readsize, RSP_MEMORY, serial_recv_timeout, u32_to_b4(), and verbose.

Referenced by jtagmkII_dragon_dw_initpgm(), jtagmkII_dragon_initpgm(), jtagmkII_dragon_pdi_initpgm(), jtagmkII_dw_initpgm(), jtagmkII_initpgm(), and jtagmkII_pdi_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_paged_load32()

static int jtagmkII_paged_load32 ( PROGRAMMER pgm,
AVRPART p,
AVRMEM m,
unsigned int  page_size,
unsigned int  addr,
unsigned int  n_bytes 
)
static
3475{
3476 unsigned int block_size;
3477 unsigned int maxaddr = addr + n_bytes;
3478 unsigned char cmd[7];
3479 unsigned char *resp;
3480 int lineno, status;
3481 unsigned long val=0;
3482 long otimeout = serial_recv_timeout;
3483
3484 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_paged_load32(.., %s, %d, %d)\n",
3485 progname, m->desc, page_size, n_bytes);
3486
3487 serial_recv_timeout = 256;
3488
3489 if(!(p->flags & AVRPART_WRITE)) {
3491 if(status != 0) {lineno = __LINE__; goto eRR;}
3492 }
3493
3494 // Init SMC and set clocks
3495 if(!(p->flags & AVRPART_INIT_SMC)) {
3496 status = jtagmkII_smc_init32(pgm);
3497 if(status != 0) {lineno = __LINE__; goto eRR;} // PLL 0
3498 p->flags |= AVRPART_INIT_SMC;
3499 }
3500
3501 // Init SMC and set clocks
3502 if(!(p->flags & AVRPART_INIT_SMC)) {
3503 status = jtagmkII_smc_init32(pgm);
3504 if(status != 0) {lineno = __LINE__; goto eRR;} // PLL 0
3505 p->flags |= AVRPART_INIT_SMC;
3506 }
3507
3508 //avrdude_message(MSG_INFO, "\n pageSize=%d bytes=%d pages=%d m->offset=0x%x pgm->page_size %d\n",
3509 // page_size, n_bytes, pages, m->offset, pgm->page_size);
3510
3512 cmd[1] = 0x40;
3513 cmd[2] = 0x05;
3514
3515 for (; addr < maxaddr; addr += block_size) {
3516 block_size = ((maxaddr-addr) < pgm->page_size) ? (maxaddr - addr) : pgm->page_size;
3517 avrdude_message(MSG_DEBUG, "%s: jtagmkII_paged_load32(): "
3518 "block_size at addr %d is %d\n",
3519 progname, addr, block_size);
3520
3521 u32_to_b4r(cmd + 3, m->offset + addr);
3522
3523 status = jtagmkII_send(pgm, cmd, 7);
3524 if(status<0) {lineno = __LINE__; goto eRR;}
3525 status = jtagmkII_recv(pgm, &resp);
3526 if(status<0) {lineno = __LINE__; goto eRR;}
3527
3528 if (verbose >= 3) {
3529 putc('\n', stderr);
3530 jtagmkII_prmsg(pgm, resp, status);
3531 } else if (verbose == 2)
3532 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
3533 if (resp[0] != 0x87) {
3534 avrdude_message(MSG_INFO, "%s: jtagmkII_paged_load32(): "
3535 "bad response to write memory command: %s\n",
3536 progname, jtagmkII_get_rc(resp[0]));
3537 free(resp);
3538 return -1;
3539 }
3540 memcpy(m->buf + addr, resp + 1, block_size);
3541 free(resp);
3542
3543 }
3544
3545 serial_recv_timeout = otimeout;
3546
3548 if(status < 0) {lineno = __LINE__; goto eRR;}
3549
3550 return addr;
3551
3552 eRR:
3553 serial_recv_timeout = otimeout;
3554 avrdude_message(MSG_INFO, "%s: jtagmkII_paged_load32(): "
3555 "failed at line %d (status=%x val=%lx)\n",
3556 progname, lineno, status, val);
3557 return -1;
3558}
static void u32_to_b4r(unsigned char *b, unsigned long l)
Definition jtagmkII.c:224
static int jtagmkII_smc_init32(PROGRAMMER *pgm)
Definition jtagmkII.c:2996
#define AVR32_RESET_READ
Definition jtagmkII_private.h:295
#define CMND_READ_MEMORY32
Definition jtagmkII_private.h:109
#define AVR32_SET4RUNNING
Definition jtagmkII_private.h:298
#define AVRPART_WRITE
Definition libavrdude.h:205
#define AVRPART_INIT_SMC
Definition libavrdude.h:204

References AVR32_RESET_READ, AVR32_SET4RUNNING, avrdude_message(), AVRPART_INIT_SMC, AVRPART_WRITE, avrmem::buf, cmd, CMND_READ_MEMORY32, avrmem::desc, avrpart::flags, free(), jtagmkII_get_rc(), jtagmkII_prmsg(), jtagmkII_recv(), jtagmkII_reset32(), jtagmkII_send(), jtagmkII_smc_init32(), lineno, MSG_DEBUG, MSG_INFO, MSG_NOTICE2, avrmem::offset, programmer_t::page_size, pgm, progname, serial_recv_timeout, u32_to_b4r(), and verbose.

Referenced by jtagmkII_avr32_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_paged_write()

static int jtagmkII_paged_write ( PROGRAMMER pgm,
AVRPART p,
AVRMEM m,
unsigned int  page_size,
unsigned int  addr,
unsigned int  n_bytes 
)
static
1978{
1979 unsigned int block_size;
1980 unsigned int maxaddr = addr + n_bytes;
1981 unsigned char *cmd;
1982 unsigned char *resp;
1983 int status, tries, dynamic_memtype = 0;
1984 long otimeout = serial_recv_timeout;
1985
1986 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_paged_write(.., %s, %d, %d)\n",
1987 progname, m->desc, page_size, n_bytes);
1988
1990 return -1;
1991
1992 if (page_size == 0) page_size = 256;
1993 else if (page_size > 256) page_size = 256;
1994
1995 if ((cmd = malloc(page_size + 10)) == NULL) {
1996 avrdude_message(MSG_INFO, "%s: jtagmkII_paged_write(): Out of memory\n",
1997 progname);
1998 return -1;
1999 }
2000
2002 if (strcmp(m->desc, "flash") == 0) {
2003 PDATA(pgm)->flash_pageaddr = (unsigned long)-1L;
2004 cmd[1] = jtagmkII_memtype(pgm, p, addr);
2005 if (p->flags & AVRPART_HAS_PDI)
2006 /* dynamically decide between flash/boot memtype */
2007 dynamic_memtype = 1;
2008 } else if (strcmp(m->desc, "eeprom") == 0) {
2009 if (pgm->flag & PGM_FL_IS_DW) {
2010 /*
2011 * jtagmkII_paged_write() to EEPROM attempted while in
2012 * DW mode. Use jtagmkII_write_byte() instead.
2013 */
2014 for (; addr < maxaddr; addr++) {
2015 status = jtagmkII_write_byte(pgm, p, m, addr, m->buf[addr]);
2016 if (status < 0) {
2017 free(cmd);
2018 return -1;
2019 }
2020 }
2021 free(cmd);
2022 return n_bytes;
2023 }
2025 PDATA(pgm)->eeprom_pageaddr = (unsigned long)-1L;
2026 } else if ( ( strcmp(m->desc, "usersig") == 0 ) ) {
2027 cmd[1] = MTYPE_USERSIG;
2028 } else if ( ( strcmp(m->desc, "boot") == 0 ) ) {
2029 cmd[1] = MTYPE_BOOT_FLASH;
2030 } else if ( p->flags & AVRPART_HAS_PDI ) {
2031 cmd[1] = MTYPE_FLASH;
2032 } else {
2033 cmd[1] = MTYPE_SPM;
2034 }
2035 serial_recv_timeout = 100;
2036 for (; addr < maxaddr; addr += page_size) {
2037 if ((maxaddr - addr) < page_size)
2038 block_size = maxaddr - addr;
2039 else
2040 block_size = page_size;
2041 avrdude_message(MSG_DEBUG, "%s: jtagmkII_paged_write(): "
2042 "block_size at addr %d is %d\n",
2043 progname, addr, block_size);
2044
2045 if (dynamic_memtype)
2046 cmd[1] = jtagmkII_memtype(pgm, p, addr);
2047
2048 u32_to_b4(cmd + 2, page_size);
2049 u32_to_b4(cmd + 6, jtagmkII_memaddr(pgm, p, m, addr));
2050
2051 /*
2052 * The JTAG ICE will refuse to write anything but a full page, at
2053 * least for the flash ROM. If a partial page has been requested,
2054 * set the remainder to 0xff. (Maybe we should rather read back
2055 * the existing contents instead before? Doesn't matter much, as
2056 * bits cannot be written to 1 anyway.)
2057 */
2058 memset(cmd + 10, 0xff, page_size);
2059 memcpy(cmd + 10, m->buf + addr, block_size);
2060
2061 tries = 0;
2062
2063 retry:
2064 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_paged_write(): "
2065 "Sending write memory command: ",
2066 progname);
2067 jtagmkII_send(pgm, cmd, page_size + 10);
2068
2069 status = jtagmkII_recv(pgm, &resp);
2070 if (status <= 0) {
2071 if (verbose >= 2)
2072 putc('\n', stderr);
2073 avrdude_message(MSG_INFO, "%s: jtagmkII_paged_write(): "
2074 "timeout/error communicating with programmer (status %d)\n",
2075 progname, status);
2076 if (tries++ < 4) {
2078 goto retry;
2079 }
2080 avrdude_message(MSG_INFO, "%s: jtagmkII_paged_write(): fatal timeout/"
2081 "error communicating with programmer (status %d)\n",
2082 progname, status);
2083 free(cmd);
2084 serial_recv_timeout = otimeout;
2085 return -1;
2086 }
2087 if (verbose >= 3) {
2088 putc('\n', stderr);
2089 jtagmkII_prmsg(pgm, resp, status);
2090 } else if (verbose == 2)
2091 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
2092 if (resp[0] != RSP_OK) {
2093 avrdude_message(MSG_INFO, "%s: jtagmkII_paged_write(): "
2094 "bad response to write memory command: %s\n",
2095 progname, jtagmkII_get_rc(resp[0]));
2096 free(resp);
2097 free(cmd);
2098 serial_recv_timeout = otimeout;
2099 return -1;
2100 }
2101 free(resp);
2102 }
2103
2104 free(cmd);
2105 serial_recv_timeout = otimeout;
2106
2107 return n_bytes;
2108}
#define CMND_WRITE_MEMORY
Definition jtagmkII_private.h:81

References avrdude_message(), AVRPART_HAS_PDI, avrmem::buf, cmd, CMND_WRITE_MEMORY, avrmem::desc, programmer_t::flag, avrpart::flags, free(), jtagmkII_get_rc(), jtagmkII_memaddr(), jtagmkII_memtype(), jtagmkII_prmsg(), jtagmkII_program_enable(), jtagmkII_recv(), jtagmkII_send(), jtagmkII_write_byte(), long, malloc(), MSG_DEBUG, MSG_INFO, MSG_NOTICE2, MTYPE_BOOT_FLASH, MTYPE_EEPROM, MTYPE_EEPROM_PAGE, MTYPE_FLASH, MTYPE_SPM, MTYPE_USERSIG, PDATA, pgm, PGM_FL_IS_DW, progname, RSP_OK, serial_recv_timeout, u32_to_b4(), and verbose.

Referenced by jtagmkII_dragon_dw_initpgm(), jtagmkII_dragon_initpgm(), jtagmkII_dragon_pdi_initpgm(), jtagmkII_dw_initpgm(), jtagmkII_initpgm(), and jtagmkII_pdi_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_paged_write32()

static int jtagmkII_paged_write32 ( PROGRAMMER pgm,
AVRPART p,
AVRMEM m,
unsigned int  page_size,
unsigned int  addr,
unsigned int  n_bytes 
)
static
3563{
3564 unsigned int block_size;
3565 unsigned char *cmd=NULL;
3566 unsigned char *resp;
3567 int lineno, status, pages, sPageNum, pageNum, blocks;
3568 unsigned long val=0;
3569 unsigned long otimeout = serial_recv_timeout;
3570 unsigned int maxaddr = addr + n_bytes;
3571
3572 serial_recv_timeout = 256;
3573
3574 if(n_bytes == 0) return -1;
3575
3577 if(status != 0) {lineno = __LINE__; goto eRR;}
3578 p->flags |= AVRPART_WRITE;
3579
3580 pages = (n_bytes - addr - 1)/page_size + 1;
3581 sPageNum = addr/page_size;
3582 //avrdude_message(MSG_INFO, "\n pageSize=%d bytes=%d pages=%d m->offset=0x%x pgm->page_size %d\n",
3583 // page_size, n_bytes, pages, m->offset, pgm->page_size);
3584
3585 // Before any errors can happen
3586 if ((cmd = malloc(pgm->page_size + 10)) == NULL) {
3587 avrdude_message(MSG_INFO, "%s: jtagmkII_paged_write32(): Out of memory\n", progname);
3588 return -1;
3589 }
3590
3591 // Init SMC and set clocks
3592 if(!(p->flags & AVRPART_INIT_SMC)) {
3593 status = jtagmkII_smc_init32(pgm);
3594 if(status != 0) {lineno = __LINE__; goto eRR;} // PLL 0
3595 p->flags |= AVRPART_INIT_SMC;
3596 }
3597
3598 // First unlock the pages
3599 for(pageNum=sPageNum; pageNum < pages; ++pageNum) {
3600 status =jtagmkII_flash_lock32(pgm, 0, pageNum);
3601 if(status < 0) {lineno = __LINE__; goto eRR;}
3602 }
3603
3604 // Then erase them (guess could do this in the same loop above?)
3605 for(pageNum=sPageNum; pageNum < pages; ++pageNum) {
3606 status =jtagmkII_flash_erase32(pgm, pageNum);
3607 if(status < 0) {lineno = __LINE__; goto eRR;}
3608 }
3609
3611 u32_to_b4r(&cmd[1], 0x40000000); // who knows
3612 cmd[5] = 0x5;
3613
3614 for(pageNum=sPageNum; pageNum < pages; ++pageNum) {
3615
3617 if(status != 0) {lineno = __LINE__; goto eRR;}
3618
3619 for(blocks=0; blocks<2; ++blocks) {
3620 block_size = ((maxaddr-addr) < pgm->page_size) ? (maxaddr - addr) : pgm->page_size;
3621 avrdude_message(MSG_DEBUG, "%s: jtagmkII_paged_write32(): "
3622 "block_size at addr %d is %d\n",
3623 progname, addr, block_size);
3624
3625 u32_to_b4r(cmd + 6, m->offset + addr);
3626 memset(cmd + 10, 0xff, pgm->page_size);
3627 memcpy(cmd + 10, m->buf + addr, block_size);
3628
3629 status = jtagmkII_send(pgm, cmd, pgm->page_size + 10);
3630 if(status<0) {lineno = __LINE__; goto eRR;}
3631 status = jtagmkII_recv(pgm, &resp);
3632 if (status<0) {lineno = __LINE__; goto eRR;}
3633
3634 if (verbose >= 3) {
3635 putc('\n', stderr);
3636 jtagmkII_prmsg(pgm, resp, status);
3637 } else if (verbose == 2)
3638 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
3639 if (resp[0] != RSP_OK) {
3640 avrdude_message(MSG_INFO, "%s: jtagmkII_paged_write32(): "
3641 "bad response to write memory command: %s\n",
3642 progname, jtagmkII_get_rc(resp[0]));
3643 free(resp);
3644 free(cmd);
3645 return -1;
3646 }
3647 free(resp);
3648
3649 addr += block_size;
3650
3651
3652 }
3653 status = jtagmkII_flash_write_page32(pgm, pageNum);
3654 if(status < 0) {lineno = __LINE__; goto eRR;}
3655 }
3656 free(cmd);
3657 serial_recv_timeout = otimeout;
3658
3659 status = jtagmkII_reset32(pgm, AVR32_SET4RUNNING); // AVR32_SET4RUNNING | AVR32_RELEASE_JTAG
3660 if(status < 0) {lineno = __LINE__; goto eRR;}
3661
3662 return addr;
3663
3664 eRR:
3665 serial_recv_timeout = otimeout;
3666 free(cmd);
3667 avrdude_message(MSG_INFO, "%s: jtagmkII_paged_write32(): "
3668 "failed at line %d (status=%x val=%lx)\n",
3669 progname, lineno, status, val);
3670 return -1;
3671}
static int jtagmkII_flash_write_page32(PROGRAMMER *pgm, unsigned int page)
Definition jtagmkII.c:3741
static int jtagmkII_flash_clear_pagebuffer32(PROGRAMMER *pgm)
Definition jtagmkII.c:3771
static int jtagmkII_flash_erase32(PROGRAMMER *pgm, unsigned int page)
Definition jtagmkII.c:3701
static int jtagmkII_flash_lock32(PROGRAMMER *pgm, unsigned char lock, unsigned int page)
Definition jtagmkII.c:3674
#define AVR32_RESET_WRITE
Definition jtagmkII_private.h:296
#define CMND_WRITE_MEMORY32
Definition jtagmkII_private.h:110

References AVR32_RESET_WRITE, AVR32_SET4RUNNING, avrdude_message(), AVRPART_INIT_SMC, AVRPART_WRITE, avrmem::buf, cmd, CMND_WRITE_MEMORY32, avrpart::flags, free(), jtagmkII_flash_clear_pagebuffer32(), jtagmkII_flash_erase32(), jtagmkII_flash_lock32(), jtagmkII_flash_write_page32(), jtagmkII_get_rc(), jtagmkII_prmsg(), jtagmkII_recv(), jtagmkII_reset32(), jtagmkII_send(), jtagmkII_smc_init32(), lineno, malloc(), MSG_DEBUG, MSG_INFO, MSG_NOTICE2, avrmem::offset, programmer_t::page_size, pgm, progname, RSP_OK, serial_recv_timeout, u32_to_b4r(), and verbose.

Referenced by jtagmkII_avr32_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_parseextparms()

static int jtagmkII_parseextparms ( PROGRAMMER pgm,
LISTID  extparms 
)
static
1446{
1447 LNODEID ln;
1448 const char *extended_param;
1449 int rv = 0;
1450
1451 for (ln = lfirst(extparms); ln; ln = lnext(ln)) {
1452 extended_param = ldata(ln);
1453
1454 if (strncmp(extended_param, "jtagchain=", strlen("jtagchain=")) == 0) {
1455 unsigned int ub, ua, bb, ba;
1456 if (sscanf(extended_param, "jtagchain=%u,%u,%u,%u", &ub, &ua, &bb, &ba)
1457 != 4) {
1458 avrdude_message(MSG_INFO, "%s: jtagmkII_parseextparms(): invalid JTAG chain '%s'\n",
1459 progname, extended_param);
1460 rv = -1;
1461 continue;
1462 }
1463 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_parseextparms(): JTAG chain parsed as:\n"
1464 "%s %u units before, %u units after, %u bits before, %u bits after\n",
1465 progname,
1466 progbuf, ub, ua, bb, ba);
1467 PDATA(pgm)->jtagchain[0] = ub;
1468 PDATA(pgm)->jtagchain[1] = ua;
1469 PDATA(pgm)->jtagchain[2] = bb;
1470 PDATA(pgm)->jtagchain[3] = ba;
1471
1472 continue;
1473 }
1474
1475 avrdude_message(MSG_INFO, "%s: jtagmkII_parseextparms(): invalid extended parameter '%s'\n",
1476 progname, extended_param);
1477 rv = -1;
1478 }
1479
1480 return rv;
1481}
void * ldata(LNODEID)
Definition lists.c:720
void * LNODEID
Definition libavrdude.h:64
LNODEID lnext(LNODEID)
Definition lists.c:704
LNODEID lfirst(LISTID)
Definition lists.c:688

References avrdude_message(), ldata(), lfirst(), lnext(), MSG_INFO, MSG_NOTICE2, PDATA, pgm, progbuf, and progname.

Referenced by jtagmkII_dragon_initpgm(), and jtagmkII_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_pdi_initpgm()

void jtagmkII_pdi_initpgm ( PROGRAMMER pgm)
3874{
3875 strcpy(pgm->type, "JTAGMKII_PDI");
3876
3877 /*
3878 * mandatory functions
3879 */
3890
3891 /*
3892 * optional functions
3893 */
3900 pgm->page_size = 256;
3902}
static int jtagmkII_open_pdi(PROGRAMMER *pgm, char *port)
Definition jtagmkII.c:1592

References programmer_t::chip_erase, programmer_t::close, programmer_t::disable, programmer_t::display, programmer_t::enable, programmer_t::flag, programmer_t::initialize, jtagmkII_chip_erase(), jtagmkII_close(), jtagmkII_disable(), jtagmkII_display(), jtagmkII_enable(), jtagmkII_initialize(), jtagmkII_open_pdi(), jtagmkII_page_erase(), jtagmkII_paged_load(), jtagmkII_paged_write(), jtagmkII_print_parms(), jtagmkII_program_enable_INFO(), jtagmkII_read_byte(), jtagmkII_setup(), jtagmkII_teardown(), jtagmkII_write_byte(), programmer_t::open, programmer_t::page_erase, programmer_t::page_size, programmer_t::paged_load, programmer_t::paged_write, pgm, PGM_FL_IS_PDI, programmer_t::print_parms, programmer_t::program_enable, programmer_t::read_byte, programmer_t::setup, programmer_t::teardown, programmer_t::type, and programmer_t::write_byte.

+ Here is the call graph for this function:

◆ jtagmkII_print_memory()

static void jtagmkII_print_memory ( unsigned char *  b,
size_t  s 
)
static
265{
266 int i;
267
268 if (s < 2)
269 return;
270
271 for (i = 0; i < s - 1; i++) {
272 avrdude_message(MSG_INFO, "0x%02x ", b[i + 1]);
273 if (i % 16 == 15)
274 putc('\n', stderr);
275 else
276 putc(' ', stderr);
277 }
278 if (i % 16 != 0)
279 putc('\n', stderr);
280}

References avrdude_message(), and MSG_INFO.

Referenced by jtagmkII_prmsg().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_print_parms()

static void jtagmkII_print_parms ( PROGRAMMER pgm)
static
2719{
2721}

References jtagmkII_print_parms1(), and pgm.

Referenced by jtagmkII_avr32_initpgm(), jtagmkII_dragon_dw_initpgm(), jtagmkII_dragon_initpgm(), jtagmkII_dragon_pdi_initpgm(), jtagmkII_dw_initpgm(), jtagmkII_initpgm(), and jtagmkII_pdi_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_print_parms1()

static void jtagmkII_print_parms1 ( PROGRAMMER pgm,
const char *  p 
)
static
2682{
2683 unsigned char vtarget[4], jtag_clock[4];
2684 char clkbuf[20];
2685 double clk;
2686
2687 if (jtagmkII_getparm(pgm, PAR_OCD_VTARGET, vtarget) < 0)
2688 return;
2689
2690 avrdude_message(MSG_INFO, "%sVtarget : %.1f V\n", p,
2691 b2_to_u16(vtarget) / 1000.0);
2692
2693 if ((pgm->flag & PGM_FL_IS_JTAG)) {
2694 if (jtagmkII_getparm(pgm, PAR_OCD_JTAG_CLK, jtag_clock) < 0)
2695 return;
2696
2697 if (jtag_clock[0] == 0) {
2698 strcpy(clkbuf, "6.4 MHz");
2699 clk = 6.4e6;
2700 } else if (jtag_clock[0] == 1) {
2701 strcpy(clkbuf, "2.8 MHz");
2702 clk = 2.8e6;
2703 } else if (jtag_clock[0] <= 5) {
2704 sprintf(clkbuf, "%.1f MHz", 5.35 / (double)jtag_clock[0]);
2705 clk = 5.35e6 / (double)jtag_clock[0];
2706 } else {
2707 sprintf(clkbuf, "%.1f kHz", 5.35e3 / (double)jtag_clock[0]);
2708 clk = 5.35e6 / (double)jtag_clock[0];
2709
2710 avrdude_message(MSG_INFO, "%sJTAG clock : %s (%.1f us)\n", p, clkbuf,
2711 1.0e6 / clk);
2712 }
2713 }
2714
2715 return;
2716}
static unsigned short b2_to_u16(unsigned char *b)
Definition jtagmkII.c:233
#define PAR_OCD_JTAG_CLK
Definition jtagmkII_private.h:210
#define PAR_OCD_VTARGET
Definition jtagmkII_private.h:209

References avrdude_message(), b2_to_u16(), programmer_t::flag, jtagmkII_getparm(), MSG_INFO, PAR_OCD_JTAG_CLK, PAR_OCD_VTARGET, pgm, and PGM_FL_IS_JTAG.

Referenced by jtagmkII_display(), and jtagmkII_print_parms().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_prmsg()

static void jtagmkII_prmsg ( PROGRAMMER pgm,
unsigned char *  data,
size_t  len 
)
static
283{
284 int i;
285
286 if (verbose >= 4) {
287 avrdude_message(MSG_TRACE, "Raw message:\n");
288
289 for (i = 0; i < len; i++) {
290 avrdude_message(MSG_TRACE, "0x%02x", data[i]);
291 if (i % 16 == 15)
292 putc('\n', stderr);
293 else
294 putc(' ', stderr);
295 }
296 if (i % 16 != 0)
297 putc('\n', stderr);
298 }
299
300 switch (data[0]) {
301 case RSP_OK:
302 avrdude_message(MSG_INFO, "OK\n");
303 break;
304
305 case RSP_FAILED:
306 avrdude_message(MSG_INFO, "FAILED\n");
307 break;
308
310 avrdude_message(MSG_INFO, "Illegal breakpoint\n");
311 break;
312
314 avrdude_message(MSG_INFO, "Illegal command\n");
315 break;
316
318 avrdude_message(MSG_INFO, "Illegal emulator mode");
319 if (len > 1)
320 switch (data[1]) {
321 case EMULATOR_MODE_DEBUGWIRE: avrdude_message(MSG_INFO, ": DebugWire"); break;
322 case EMULATOR_MODE_JTAG: avrdude_message(MSG_INFO, ": JTAG"); break;
323 case EMULATOR_MODE_HV: avrdude_message(MSG_INFO, ": HVSP/PP"); break;
324 case EMULATOR_MODE_SPI: avrdude_message(MSG_INFO, ": SPI"); break;
325 case EMULATOR_MODE_JTAG_XMEGA: avrdude_message(MSG_INFO, ": JTAG/Xmega"); break;
326 }
327 putc('\n', stderr);
328 break;
329
331 avrdude_message(MSG_INFO, "Illegal JTAG ID\n");
332 break;
333
335 avrdude_message(MSG_INFO, "Illegal MCU state");
336 if (len > 1)
337 switch (data[1]) {
338 case STOPPED: avrdude_message(MSG_INFO, ": Stopped"); break;
339 case RUNNING: avrdude_message(MSG_INFO, ": Running"); break;
340 case PROGRAMMING: avrdude_message(MSG_INFO, ": Programming"); break;
341 }
342 putc('\n', stderr);
343 break;
344
346 avrdude_message(MSG_INFO, "Illegal memory type\n");
347 break;
348
350 avrdude_message(MSG_INFO, "Illegal memory range\n");
351 break;
352
354 avrdude_message(MSG_INFO, "Illegal parameter\n");
355 break;
356
358 avrdude_message(MSG_INFO, "Illegal power state\n");
359 break;
360
362 avrdude_message(MSG_INFO, "Illegal value\n");
363 break;
364
366 avrdude_message(MSG_INFO, "No target power\n");
367 break;
368
369 case RSP_SIGN_ON:
370 avrdude_message(MSG_INFO, "Sign-on succeeded\n");
371 /* Sign-on data will be printed below anyway. */
372 break;
373
374 case RSP_MEMORY:
375 avrdude_message(MSG_INFO, "memory contents:\n");
376 jtagmkII_print_memory(data, len);
377 break;
378
379 case RSP_PARAMETER:
380 avrdude_message(MSG_INFO, "parameter values:\n");
381 jtagmkII_print_memory(data, len);
382 break;
383
384 case RSP_SPI_DATA:
385 avrdude_message(MSG_INFO, "SPI data returned:\n");
386 for (i = 1; i < len; i++)
387 avrdude_message(MSG_INFO, "0x%02x ", data[i]);
388 putc('\n', stderr);
389 break;
390
391 case EVT_BREAK:
392 avrdude_message(MSG_INFO, "BREAK event");
393 if (len >= 6) {
394 avrdude_message(MSG_INFO, ", PC = 0x%lx, reason ", b4_to_u32(data + 1));
395 switch (data[5]) {
396 case 0x00:
397 avrdude_message(MSG_INFO, "unspecified");
398 break;
399 case 0x01:
400 avrdude_message(MSG_INFO, "program break");
401 break;
402 case 0x02:
403 avrdude_message(MSG_INFO, "data break PDSB");
404 break;
405 case 0x03:
406 avrdude_message(MSG_INFO, "data break PDMSB");
407 break;
408 default:
409 avrdude_message(MSG_INFO, "unknown: 0x%02x", data[5]);
410 }
411 }
412 putc('\n', stderr);
413 break;
414
415 default:
416 avrdude_message(MSG_INFO, "unknown message 0x%02x\n", data[0]);
417 }
418
419 putc('\n', stderr);
420}
#define MSG_TRACE
Definition avrdude.h:55
static void jtagmkII_print_memory(unsigned char *b, size_t s)
Definition jtagmkII.c:264
static unsigned long b4_to_u32(unsigned char *b)
Definition jtagmkII.c:193
#define PROGRAMMING
Definition jtagmkII_private.h:232
#define EVT_BREAK
Definition jtagmkII_private.h:141
#define RSP_SPI_DATA
Definition jtagmkII_private.h:124
#define RUNNING
Definition jtagmkII_private.h:231
#define RSP_ILLEGAL_MEMORY_RANGE
Definition jtagmkII_private.h:128
#define RSP_ILLEGAL_JTAG_ID
Definition jtagmkII_private.h:134
#define RSP_FAILED
Definition jtagmkII_private.h:125
#define RSP_ILLEGAL_EMULATOR_MODE
Definition jtagmkII_private.h:129
#define RSP_ILLEGAL_BREAKPOINT
Definition jtagmkII_private.h:133
#define RSP_ILLEGAL_VALUE
Definition jtagmkII_private.h:131
#define RSP_ILLEGAL_POWER_STATE
Definition jtagmkII_private.h:138
#define EMULATOR_MODE_HV
Definition jtagmkII_private.h:194
#define RSP_ILLEGAL_PARAMETER
Definition jtagmkII_private.h:126
#define RSP_ILLEGAL_COMMAND
Definition jtagmkII_private.h:135
#define STOPPED
Definition jtagmkII_private.h:230
#define RSP_ILLEGAL_MCU_STATE
Definition jtagmkII_private.h:130
#define RSP_NO_TARGET_POWER
Definition jtagmkII_private.h:136
#define RSP_ILLEGAL_MEMORY_TYPE
Definition jtagmkII_private.h:127

References avrdude_message(), b4_to_u32(), EMULATOR_MODE_DEBUGWIRE, EMULATOR_MODE_HV, EMULATOR_MODE_JTAG, EMULATOR_MODE_JTAG_XMEGA, EMULATOR_MODE_SPI, EVT_BREAK, jtagmkII_print_memory(), MSG_INFO, MSG_TRACE, PROGRAMMING, RSP_FAILED, RSP_ILLEGAL_BREAKPOINT, RSP_ILLEGAL_COMMAND, RSP_ILLEGAL_EMULATOR_MODE, RSP_ILLEGAL_JTAG_ID, RSP_ILLEGAL_MCU_STATE, RSP_ILLEGAL_MEMORY_RANGE, RSP_ILLEGAL_MEMORY_TYPE, RSP_ILLEGAL_PARAMETER, RSP_ILLEGAL_POWER_STATE, RSP_ILLEGAL_VALUE, RSP_MEMORY, RSP_NO_TARGET_POWER, RSP_OK, RSP_PARAMETER, RSP_SIGN_ON, RSP_SPI_DATA, RUNNING, STOPPED, and verbose.

Referenced by jtagmkII_chip_erase(), jtagmkII_close(), jtagmkII_close32(), jtagmkII_getparm(), jtagmkII_getsync(), jtagmkII_page_erase(), jtagmkII_paged_load(), jtagmkII_paged_load32(), jtagmkII_paged_write(), jtagmkII_paged_write32(), jtagmkII_program_disable(), jtagmkII_program_enable(), jtagmkII_read_byte(), jtagmkII_reset(), jtagmkII_set_devdescr(), jtagmkII_set_xmega_params(), jtagmkII_setparm(), and jtagmkII_write_byte().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_program_disable()

static int jtagmkII_program_disable ( PROGRAMMER pgm)
static
1207{
1208 int status;
1209 unsigned char buf[1], *resp, c;
1210
1211 if (!PDATA(pgm)->prog_enabled)
1212 return 0;
1213
1214 buf[0] = CMND_LEAVE_PROGMODE;
1215 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_program_disable(): "
1216 "Sending leave progmode command: ",
1217 progname);
1218 jtagmkII_send(pgm, buf, 1);
1219
1220 status = jtagmkII_recv(pgm, &resp);
1221 if (status <= 0) {
1222 if (verbose >= 2)
1223 putc('\n', stderr);
1224 avrdude_message(MSG_INFO, "%s: jtagmkII_program_disable(): "
1225 "timeout/error communicating with programmer (status %d)\n",
1226 progname, status);
1227 return -1;
1228 }
1229 if (verbose >= 3) {
1230 putc('\n', stderr);
1231 jtagmkII_prmsg(pgm, resp, status);
1232 } else if (verbose == 2)
1233 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
1234 c = resp[0];
1235 free(resp);
1236 if (c != RSP_OK) {
1237 avrdude_message(MSG_INFO, "%s: jtagmkII_program_disable(): "
1238 "bad response to leave progmode command: %s\n",
1240 return -1;
1241 }
1242
1243 PDATA(pgm)->prog_enabled = 0;
1244 (void)jtagmkII_reset(pgm, 0x01);
1245
1246 return 0;
1247}
#define CMND_LEAVE_PROGMODE
Definition jtagmkII_private.h:97

References avrdude_message(), CMND_LEAVE_PROGMODE, free(), jtagmkII_get_rc(), jtagmkII_prmsg(), jtagmkII_recv(), jtagmkII_reset(), jtagmkII_send(), MSG_INFO, MSG_NOTICE2, PDATA, pgm, progname, RSP_OK, verbose, and void().

Referenced by jtagmkII_disable(), and jtagmkII_write_byte().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_program_enable()

static int jtagmkII_program_enable ( PROGRAMMER pgm)
static
1151{
1152 int status;
1153 unsigned char buf[1], *resp, c;
1154 int use_ext_reset;
1155
1156 if (PDATA(pgm)->prog_enabled)
1157 return 0;
1158
1159 for (use_ext_reset = 0; use_ext_reset <= 1; use_ext_reset++) {
1160 buf[0] = CMND_ENTER_PROGMODE;
1161 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_program_enable(): "
1162 "Sending enter progmode command: ",
1163 progname);
1164 jtagmkII_send(pgm, buf, 1);
1165
1166 status = jtagmkII_recv(pgm, &resp);
1167 if (status <= 0) {
1168 if (verbose >= 2)
1169 putc('\n', stderr);
1170 avrdude_message(MSG_INFO, "%s: jtagmkII_program_enable(): "
1171 "timeout/error communicating with programmer (status %d)\n",
1172 progname, status);
1173 return -1;
1174 }
1175 if (verbose >= 3) {
1176 putc('\n', stderr);
1177 jtagmkII_prmsg(pgm, resp, status);
1178 } else if (verbose == 2)
1179 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
1180 c = resp[0];
1181 free(resp);
1182 if (c != RSP_OK) {
1183 avrdude_message(MSG_INFO, "%s: jtagmkII_program_enable(): "
1184 "bad response to enter progmode command: %s\n",
1186 if (c == RSP_ILLEGAL_JTAG_ID) {
1187 if (use_ext_reset == 0) {
1188 unsigned char parm[] = { 1};
1189 avrdude_message(MSG_INFO, "%s: retrying with external reset applied\n",
1190 progname);
1191
1193 continue;
1194 }
1195
1196 avrdude_message(MSG_INFO, "%s: JTAGEN fuse disabled?\n", progname);
1197 return -1;
1198 }
1199 }
1200 }
1201
1202 PDATA(pgm)->prog_enabled = 1;
1203 return 0;
1204}
#define CMND_ENTER_PROGMODE
Definition jtagmkII_private.h:96
#define PAR_EXTERNAL_RESET
Definition jtagmkII_private.h:222

References avrdude_message(), CMND_ENTER_PROGMODE, free(), jtagmkII_get_rc(), jtagmkII_prmsg(), jtagmkII_recv(), jtagmkII_send(), jtagmkII_setparm(), MSG_INFO, MSG_NOTICE2, PAR_EXTERNAL_RESET, PDATA, pgm, progname, RSP_ILLEGAL_JTAG_ID, RSP_OK, verbose, and void().

Referenced by jtagmkII_page_erase(), jtagmkII_paged_load(), jtagmkII_paged_write(), jtagmkII_read_byte(), and jtagmkII_write_byte().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_program_enable_INFO()

static int jtagmkII_program_enable_INFO ( PROGRAMMER pgm,
AVRPART p 
)
static
1146{
1147 return 0;
1148}

Referenced by jtagmkII_avr32_initpgm(), jtagmkII_dragon_dw_initpgm(), jtagmkII_dragon_initpgm(), jtagmkII_dragon_pdi_initpgm(), jtagmkII_dw_initpgm(), jtagmkII_initpgm(), and jtagmkII_pdi_initpgm().

+ Here is the caller graph for this function:

◆ jtagmkII_read_byte()

static int jtagmkII_read_byte ( PROGRAMMER pgm,
AVRPART p,
AVRMEM mem,
unsigned long  addr,
unsigned char *  value 
)
static
2213{
2214 unsigned char cmd[10];
2215 unsigned char *resp = NULL, *cache_ptr = NULL;
2216 int status, tries, unsupp;
2217 unsigned long paddr = 0UL, *paddr_ptr = NULL;
2218 unsigned int pagesize = 0;
2219
2220 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_read_byte(.., %s, 0x%lx, ...)\n",
2221 progname, mem->desc, addr);
2222
2224 return -1;
2225
2226 cmd[0] = CMND_READ_MEMORY;
2227 unsupp = 0;
2228
2229 addr += mem->offset;
2231 if (strcmp(mem->desc, "flash") == 0 ||
2232 strcmp(mem->desc, "application") == 0 ||
2233 strcmp(mem->desc, "apptable") == 0 ||
2234 strcmp(mem->desc, "boot") == 0) {
2235 pagesize = PDATA(pgm)->flash_pagesize;
2236 paddr = addr & ~(pagesize - 1);
2237 paddr_ptr = &PDATA(pgm)->flash_pageaddr;
2238 cache_ptr = PDATA(pgm)->flash_pagecache;
2239 } else if (strcmp(mem->desc, "eeprom") == 0) {
2240 if ( (pgm->flag & PGM_FL_IS_DW) || ( p->flags & AVRPART_HAS_PDI ) ) {
2241 /* debugWire cannot use page access for EEPROM */
2242 cmd[1] = MTYPE_EEPROM;
2243 } else {
2245 pagesize = mem->page_size;
2246 paddr = addr & ~(pagesize - 1);
2247 paddr_ptr = &PDATA(pgm)->eeprom_pageaddr;
2248 cache_ptr = PDATA(pgm)->eeprom_pagecache;
2249 }
2250 } else if (strcmp(mem->desc, "lfuse") == 0) {
2251 cmd[1] = MTYPE_FUSE_BITS;
2252 addr = 0;
2253 if (pgm->flag & PGM_FL_IS_DW)
2254 unsupp = 1;
2255 } else if (strcmp(mem->desc, "hfuse") == 0) {
2256 cmd[1] = MTYPE_FUSE_BITS;
2257 addr = 1;
2258 if (pgm->flag & PGM_FL_IS_DW)
2259 unsupp = 1;
2260 } else if (strcmp(mem->desc, "efuse") == 0) {
2261 cmd[1] = MTYPE_FUSE_BITS;
2262 addr = 2;
2263 if (pgm->flag & PGM_FL_IS_DW)
2264 unsupp = 1;
2265 } else if (strncmp(mem->desc, "lock", 4) == 0) {
2266 cmd[1] = MTYPE_LOCK_BITS;
2267 if (pgm->flag & PGM_FL_IS_DW)
2268 unsupp = 1;
2269 } else if (strncmp(mem->desc, "fuse", strlen("fuse")) == 0) {
2270 cmd[1] = MTYPE_FUSE_BITS;
2271 } else if (strcmp(mem->desc, "usersig") == 0) {
2272 cmd[1] = MTYPE_USERSIG;
2273 } else if (strcmp(mem->desc, "prodsig") == 0) {
2274 cmd[1] = MTYPE_PRODSIG;
2275 } else if (strcmp(mem->desc, "calibration") == 0) {
2277 if (pgm->flag & PGM_FL_IS_DW)
2278 unsupp = 1;
2279 } else if (strcmp(mem->desc, "signature") == 0) {
2280 cmd[1] = MTYPE_SIGN_JTAG;
2281
2282 if (pgm->flag & PGM_FL_IS_DW) {
2283 /*
2284 * In debugWire mode, there is no accessible memory area to read
2285 * the signature from, but the essential two bytes can be read
2286 * as a parameter from the ICE.
2287 */
2288 unsigned char parm[4];
2289
2290 switch (addr) {
2291 case 0:
2292 *value = 0x1E; /* Atmel vendor ID */
2293 break;
2294
2295 case 1:
2296 case 2:
2298 return -1;
2299 *value = parm[2 - addr];
2300 break;
2301
2302 default:
2303 avrdude_message(MSG_INFO, "%s: illegal address %lu for signature memory\n",
2304 progname, addr);
2305 return -1;
2306 }
2307 return 0;
2308 }
2309
2310 }
2311
2312 /*
2313 * If the respective memory area is not supported under debugWire,
2314 * leave here.
2315 */
2316 if (unsupp) {
2317 *value = 42;
2318 return -1;
2319 }
2320
2321 /*
2322 * To improve the read speed, we used paged reads for flash and
2323 * EEPROM, and cache the results in a page cache.
2324 *
2325 * Page cache validation is based on "{flash,eeprom}_pageaddr"
2326 * (holding the base address of the most recent cache fill
2327 * operation). This variable is set to (unsigned long)-1L when the
2328 * cache needs to be invalidated.
2329 */
2330 if (pagesize && paddr == *paddr_ptr) {
2331 *value = cache_ptr[addr & (pagesize - 1)];
2332 return 0;
2333 }
2334
2335 if (pagesize) {
2336 u32_to_b4(cmd + 2, pagesize);
2337 u32_to_b4(cmd + 6, paddr);
2338 } else {
2339 u32_to_b4(cmd + 2, 1);
2340 u32_to_b4(cmd + 6, addr);
2341 }
2342
2343 tries = 0;
2344 retry:
2345 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_read_byte(): Sending read memory command: ",
2346 progname);
2347 jtagmkII_send(pgm, cmd, 10);
2348
2349 status = jtagmkII_recv(pgm, &resp);
2350 if (status <= 0) {
2351 if (verbose >= 2)
2352 putc('\n', stderr);
2353 avrdude_message(MSG_INFO, "%s: jtagmkII_read_byte(): "
2354 "timeout/error communicating with programmer (status %d)\n",
2355 progname, status);
2356 if (tries++ < 3)
2357 goto retry;
2358 avrdude_message(MSG_INFO, "%s: jtagmkII_read_byte(): "
2359 "fatal timeout/error communicating with programmer (status %d)\n",
2360 progname, status);
2361 if (status < 0)
2362 resp = 0;
2363 goto fail;
2364 }
2365 if (verbose >= 3) {
2366 putc('\n', stderr);
2367 jtagmkII_prmsg(pgm, resp, status);
2368 } else if (verbose == 2)
2369 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
2370 if (resp[0] != RSP_MEMORY) {
2371 avrdude_message(MSG_INFO, "%s: jtagmkII_read_byte(): "
2372 "bad response to read memory command: %s\n",
2373 progname, jtagmkII_get_rc(resp[0]));
2374 goto fail;
2375 }
2376
2377 if (pagesize) {
2378 *paddr_ptr = paddr;
2379 memcpy(cache_ptr, resp + 1, pagesize);
2380 *value = cache_ptr[addr & (pagesize - 1)];
2381 } else
2382 *value = resp[1];
2383
2384 free(resp);
2385 return 0;
2386
2387fail:
2388 free(resp);
2389 return -1;
2390}
#define MTYPE_LOCK_BITS
Definition jtag3_private.h:160
#define MTYPE_SIGN_JTAG
Definition jtag3_private.h:161
#define MTYPE_OSCCAL_BYTE
Definition jtag3_private.h:162
#define MTYPE_FUSE_BITS
Definition jtag3_private.h:159
#define PAR_TARGET_SIGNATURE
Definition jtagmkII_private.h:235
int page_size
Definition libavrdude.h:287

References avrdude_message(), AVRPART_HAS_PDI, cmd, CMND_READ_MEMORY, avrmem::desc, programmer_t::flag, avrpart::flags, free(), jtagmkII_get_rc(), jtagmkII_getparm(), jtagmkII_prmsg(), jtagmkII_program_enable(), jtagmkII_recv(), jtagmkII_send(), MSG_INFO, MSG_NOTICE2, MTYPE_EEPROM, MTYPE_EEPROM_PAGE, MTYPE_FLASH, MTYPE_FLASH_PAGE, MTYPE_FUSE_BITS, MTYPE_LOCK_BITS, MTYPE_OSCCAL_BYTE, MTYPE_PRODSIG, MTYPE_SIGN_JTAG, MTYPE_USERSIG, avrmem::offset, avrmem::page_size, PAR_TARGET_SIGNATURE, PDATA, pgm, PGM_FL_IS_DW, progname, RSP_MEMORY, u32_to_b4(), and verbose.

Referenced by jtagmkII_avr32_initpgm(), jtagmkII_dragon_dw_initpgm(), jtagmkII_dragon_initpgm(), jtagmkII_dragon_pdi_initpgm(), jtagmkII_dw_initpgm(), jtagmkII_initialize(), jtagmkII_initpgm(), and jtagmkII_pdi_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_read_SABaddr()

static unsigned long jtagmkII_read_SABaddr ( PROGRAMMER pgm,
unsigned long  addr,
unsigned int  prefix 
)
static
3239{
3240 unsigned char buf[6], *resp;
3241 int status;
3242 unsigned long val;
3243 unsigned long otimeout = serial_recv_timeout;
3244
3245 serial_recv_timeout = 256;
3246
3247 buf[0] = CMND_READ_SAB;
3248 buf[1] = prefix;
3249 u32_to_b4r(&buf[2], addr);
3250
3251 if(jtagmkII_send(pgm, buf, 6) < 0)
3252 return ERROR_SAB;
3253
3254 status = jtagmkII_recv(pgm, &resp);
3255 if(status <= 0 || resp[0] != 0x87) {
3256 if (verbose >= 2)
3257 putc('\n', stderr);
3258 avrdude_message(MSG_INFO, "%s: jtagmkII_read_SABaddr(): "
3259 "timeout/error communicating with programmer (status %d) resp=%x\n",
3260 progname, status, resp[0]);
3261 serial_recv_timeout = otimeout;
3262
3263 if(status > 0) {
3264 int i;
3265 avrdude_message(MSG_INFO, "Cmd: ");
3266 for(i=0; i<6; ++i) avrdude_message(MSG_INFO, "%2.2x ", buf[i]);
3268 avrdude_message(MSG_INFO, "Data: ");
3269 for(i=0; i<status; ++i) avrdude_message(MSG_INFO, "%2.2x ", resp[i]);
3271 }
3272 return ERROR_SAB;
3273 }
3274
3275 if(status != 5) {
3276 if (verbose >= 2)
3277 putc('\n', stderr);
3278 avrdude_message(MSG_INFO, "%s: jtagmkII_read_SABaddr(): "
3279 "wrong number of bytes (status %d)\n",
3280 progname, status);
3281 serial_recv_timeout = otimeout;
3282 return ERROR_SAB;
3283 }
3284
3285 val = b4_to_u32r(&resp[1]);
3286 free(resp);
3287
3288 if (verbose) {
3289 if (verbose >= 2)
3290 putc('\n', stderr);
3291 avrdude_message(MSG_INFO, "%s: jtagmkII_read_SABaddr(): "
3292 "OCD Register %lx -> %4.4lx\n",
3293 progname, addr, val);
3294 }
3295 serial_recv_timeout = otimeout;
3296 return val;
3297}
static unsigned long b4_to_u32r(unsigned char *b)
Definition jtagmkII.c:204
#define CMND_READ_SAB
Definition jtagmkII_private.h:107

References avrdude_message(), b4_to_u32r(), CMND_READ_SAB, ERROR_SAB, free(), jtagmkII_recv(), jtagmkII_send(), MSG_INFO, pgm, progname, serial_recv_timeout, u32_to_b4r(), and verbose.

Referenced by jtagmkII_chip_erase32(), jtagmkII_flash_clear_pagebuffer32(), jtagmkII_flash_erase32(), jtagmkII_flash_lock32(), jtagmkII_flash_write_page32(), jtagmkII_reset32(), and jtagmkII_smc_init32().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_recv()

int jtagmkII_recv ( PROGRAMMER pgm,
unsigned char **  msg 
)
619 {
620 unsigned short r_seqno;
621 int rv;
622
623 for (;;) {
624 if ((rv = jtagmkII_recv_frame(pgm, msg, &r_seqno)) <= 0)
625 return rv;
626 avrdude_message(MSG_DEBUG, "%s: jtagmkII_recv(): "
627 "Got message seqno %d (command_sequence == %d)\n",
628 progname, r_seqno, PDATA(pgm)->command_sequence);
629 if (r_seqno == PDATA(pgm)->command_sequence) {
630 if (++(PDATA(pgm)->command_sequence) == 0xffff)
631 PDATA(pgm)->command_sequence = 0;
632 /*
633 * We move the payload to the beginning of the buffer, to make
634 * the job easier for the caller. We have to return the
635 * original pointer though, as the caller must free() it.
636 */
637 memmove(*msg, *msg + 8, rv);
638
639 if (verbose == 4)
640 {
641 int i = rv;
642 unsigned char *p = *msg;
643 avrdude_message(MSG_TRACE, "%s: Recv: ", progname);
644
645 while (i) {
646 unsigned char c = *p;
647 if (isprint(c)) {
648 avrdude_message(MSG_TRACE, "%c ", c);
649 }
650 else {
652 }
653 avrdude_message(MSG_TRACE, "[%02x] ", c);
654
655 p++;
656 i--;
657 }
659 }
660 return rv;
661 }
662 if (r_seqno == 0xffff) {
663 avrdude_message(MSG_DEBUG, "%s: jtagmkII_recv(): got asynchronous event\n",
664 progname);
665 } else {
666 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_recv(): "
667 "got wrong sequence number, %u != %u\n",
668 progname, r_seqno, PDATA(pgm)->command_sequence);
669 }
670 free(*msg);
671 }
672}
static int jtagmkII_recv_frame(PROGRAMMER *pgm, unsigned char **msg, unsigned short *seqno)
Definition jtagmkII.c:472

References avrdude_message(), free(), jtagmkII_recv_frame(), MSG_DEBUG, MSG_NOTICE2, MSG_TRACE, PDATA, pgm, progname, and verbose.

Referenced by jtagmkII_avr32_reset(), jtagmkII_chip_erase(), jtagmkII_chip_erase32(), jtagmkII_close(), jtagmkII_close32(), jtagmkII_getparm(), jtagmkII_getsync(), jtagmkII_initialize32(), jtagmkII_open32(), jtagmkII_page_erase(), jtagmkII_paged_load(), jtagmkII_paged_load32(), jtagmkII_paged_write(), jtagmkII_paged_write32(), jtagmkII_program_disable(), jtagmkII_program_enable(), jtagmkII_read_byte(), jtagmkII_read_SABaddr(), jtagmkII_reset(), jtagmkII_reset32(), jtagmkII_set_devdescr(), jtagmkII_set_xmega_params(), jtagmkII_setparm(), jtagmkII_write_byte(), and jtagmkII_write_SABaddr().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_recv_frame()

static int jtagmkII_recv_frame ( PROGRAMMER pgm,
unsigned char **  msg,
unsigned short *  seqno 
)
static
473 {
474 enum states { sSTART,
475 /* NB: do NOT change the sequence of the following: */
476 sSEQNUM1, sSEQNUM2,
477 sSIZE1, sSIZE2, sSIZE3, sSIZE4,
478 sTOKEN,
479 sDATA,
480 sCSUM1, sCSUM2,
481 /* end NB */
482 sDONE
483 } state = sSTART;
484 unsigned long msglen = 0, l = 0;
485 int headeridx = 0;
486 int timeout = 0;
487 int ignorpkt = 0;
488 int rv;
489 unsigned char c, *buf = NULL, header[8];
490 unsigned short r_seqno = 0;
491 unsigned short checksum = 0;
492
493 struct timeval tv;
494 double timeoutval = 100; /* seconds */
495 double tstart, tnow;
496
497 avrdude_message(MSG_TRACE, "%s: jtagmkII_recv():\n", progname);
498
499 gettimeofday(&tv, NULL);
500 tstart = tv.tv_sec;
501
502 while ( (state != sDONE ) && (!timeout) ) {
503 if (state == sDATA) {
504 rv = 0;
505 if (ignorpkt) {
506 /* skip packet's contents */
507 for(l = 0; l < msglen; l++)
508 rv += serial_recv(&pgm->fd, &c, 1);
509 } else {
510 rv += serial_recv(&pgm->fd, buf + 8, msglen);
511 }
512 if (rv != 0) {
513 timedout:
514 /* timeout in receive */
515 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_recv(): Timeout receiving packet\n",
516 progname);
517 free(buf);
518 return -1;
519 }
520 } else {
521 if (serial_recv(&pgm->fd, &c, 1) != 0)
522 goto timedout;
523 }
524 checksum ^= c;
525
526 if (state < sDATA)
527 header[headeridx++] = c;
528
529 switch (state) {
530 case sSTART:
531 if (c == MESSAGE_START) {
532 state = sSEQNUM1;
533 } else {
534 headeridx = 0;
535 }
536 break;
537 case sSEQNUM1:
538 case sSEQNUM2:
539 r_seqno >>= 8;
540 r_seqno |= ((unsigned)c << 8);
541 state++;
542 break;
543 case sSIZE1:
544 case sSIZE2:
545 case sSIZE3:
546 case sSIZE4:
547 msglen >>= 8;
548 msglen |= ((unsigned)c << 24);
549 state++;
550 break;
551 case sTOKEN:
552 if (c == TOKEN) {
553 state = sDATA;
554 if (msglen > MAX_MESSAGE) {
555 avrdude_message(MSG_INFO, "%s: jtagmkII_recv(): msglen %lu exceeds max message "
556 "size %u, ignoring message\n",
557 progname, msglen, MAX_MESSAGE);
558 state = sSTART;
559 headeridx = 0;
560 } else if ((buf = malloc(msglen + 10)) == NULL) {
561 avrdude_message(MSG_INFO, "%s: jtagmkII_recv(): out of memory\n",
562 progname);
563 ignorpkt++;
564 } else {
565 memcpy(buf, header, 8);
566 }
567 } else {
568 state = sSTART;
569 headeridx = 0;
570 }
571 break;
572 case sDATA:
573 /* The entire payload has been read above. */
574 l = msglen + 8;
575 state = sCSUM1;
576 break;
577 case sCSUM1:
578 case sCSUM2:
579 buf[l++] = c;
580 if (state == sCSUM2) {
581 if (crcverify(buf, msglen + 10)) {
582 if (verbose >= 9)
583 avrdude_message(MSG_TRACE2, "%s: jtagmkII_recv(): CRC OK",
584 progname);
585 state = sDONE;
586 } else {
587 avrdude_message(MSG_INFO, "%s: jtagmkII_recv(): checksum error\n",
588 progname);
589 free(buf);
590 return -4;
591 }
592 } else
593 state++;
594 break;
595 default:
596 avrdude_message(MSG_INFO, "%s: jtagmkII_recv(): unknown state\n",
597 progname);
598 free(buf);
599 return -5;
600 }
601
602 gettimeofday(&tv, NULL);
603 tnow = tv.tv_sec;
604 if (tnow - tstart > timeoutval) {
605 avrdude_message(MSG_INFO, "%s: jtagmkII_recv_frame(): timeout\n",
606 progname);
607 return -1;
608 }
609
610 }
612
613 *seqno = r_seqno;
614 *msg = buf;
615
616 return msglen;
617}
#define MSG_TRACE2
Definition avrdude.h:56
Definition config.h:42
int crcverify(const unsigned char *message, unsigned long length)
Definition crc16.c:62
#define MESSAGE_START
Definition jtagmkII_private.h:61
#define MAX_MESSAGE
Definition jtagmkII_private.h:72
#define serial_recv
Definition libavrdude.h:578
int gettimeofday(struct timeval *tp, struct timezone *tzp)
Definition unistd.cpp:21

References avrdude_message(), crcverify(), programmer_t::fd, free(), gettimeofday(), malloc(), MAX_MESSAGE, MESSAGE_START, MSG_DEBUG, MSG_INFO, MSG_NOTICE2, MSG_TRACE, MSG_TRACE2, pgm, progname, serial_recv, and verbose.

Referenced by jtagmkII_recv().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_reset()

static int jtagmkII_reset ( PROGRAMMER pgm,
unsigned char  flags 
)
static
1099{
1100 int status;
1101 unsigned char buf[2], *resp, c;
1102
1103 /*
1104 * In debugWire mode, don't reset. Do a forced stop, and tell the
1105 * ICE to stop any timers, too.
1106 */
1107 if (pgm->flag & PGM_FL_IS_DW) {
1108 unsigned char parm[] = { 0 };
1109
1111 }
1112
1114 buf[1] = (pgm->flag & PGM_FL_IS_DW)? 1: flags;
1115 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_reset(): Sending %s command: ",
1116 progname, (pgm->flag & PGM_FL_IS_DW)? "stop": "reset");
1117 jtagmkII_send(pgm, buf, 2);
1118
1119 status = jtagmkII_recv(pgm, &resp);
1120 if (status <= 0) {
1121 if (verbose >= 2)
1122 putc('\n', stderr);
1123 avrdude_message(MSG_INFO, "%s: jtagmkII_reset(): "
1124 "timeout/error communicating with programmer (status %d)\n",
1125 progname, status);
1126 return -1;
1127 }
1128 if (verbose >= 3) {
1129 putc('\n', stderr);
1130 jtagmkII_prmsg(pgm, resp, status);
1131 } else if (verbose == 2)
1132 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
1133 c = resp[0];
1134 free(resp);
1135 if (c != RSP_OK) {
1136 avrdude_message(MSG_INFO, "%s: jtagmkII_reset(): "
1137 "bad response to reset command: %s\n",
1139 return -1;
1140 }
1141
1142 return 0;
1143}
#define CMND_FORCED_STOP
Definition jtagmkII_private.h:87
#define CMND_RESET
Definition jtagmkII_private.h:88
#define PAR_TIMERS_RUNNING
Definition jtagmkII_private.h:212

References avrdude_message(), CMND_FORCED_STOP, CMND_RESET, programmer_t::flag, free(), jtagmkII_get_rc(), jtagmkII_prmsg(), jtagmkII_recv(), jtagmkII_send(), jtagmkII_setparm(), MSG_INFO, MSG_NOTICE2, PAR_TIMERS_RUNNING, pgm, PGM_FL_IS_DW, progname, RSP_OK, verbose, and void().

Referenced by jtagmkII_getsync(), jtagmkII_initialize(), and jtagmkII_program_disable().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_reset32()

static int jtagmkII_reset32 ( PROGRAMMER pgm,
unsigned short  flags 
)
static
2807{
2808 int status, j, lineno;
2809 unsigned char *resp, buf[3];
2810 unsigned long val=0;
2811
2812 avrdude_message(MSG_NOTICE, "%s: jtagmkII_reset32(%2.2x)\n",
2813 progname, flags);
2814
2815 status = -1;
2816
2817 // Happens at the start of a programming operation
2818 if(flags & AVR32_RESET_READ) {
2819 buf[0] = CMND_GET_IR;
2820 buf[1] = 0x11;
2821 status = jtagmkII_send(pgm, buf, 2);
2822 if(status < 0) {lineno = __LINE__; goto eRR;}
2823
2824 status = jtagmkII_recv(pgm, &resp);
2825 if (status != 2 || resp[0] != 0x87 || resp[1] != 01)
2826 {lineno = __LINE__; goto eRR;};
2827 }
2828
2829 if(flags & (AVR32_RESET_WRITE | AVR32_SET4RUNNING)) {
2830 // AVR_RESET(0x1F)
2831 status = jtagmkII_avr32_reset(pgm, 0x1F, 0x01, 0x00);
2832 if(status < 0) {lineno = __LINE__; goto eRR;}
2833 // AVR_RESET(0x07)
2834 status = jtagmkII_avr32_reset(pgm, 0x07, 0x11, 0x1F);
2835 if(status < 0) {lineno = __LINE__; goto eRR;}
2836 }
2837
2838 //if(flags & AVR32_RESET_COMMON)
2839 {
2840 val = jtagmkII_read_SABaddr(pgm, AVR32_DS, 0x01);
2841 if(val != 0) {lineno = __LINE__; goto eRR;}
2842 val = jtagmkII_read_SABaddr(pgm, AVR32_DC, 0x01);
2843 if(val != 0) {lineno = __LINE__; goto eRR;}
2844 }
2845
2847 status = jtagmkII_write_SABaddr(pgm, AVR32_DC, 0x01,
2849 if(status < 0) return -1;
2850 }
2851
2852 if(flags & (AVR32_RESET_WRITE | AVR32_SET4RUNNING)) {
2853 status = jtagmkII_write_SABaddr(pgm, AVR32_DC, 0x01,
2855 if(status < 0) return -1;
2856 for(j=0; j<21; ++j) {
2857 val = jtagmkII_read_SABaddr(pgm, AVR32_DS, 0x01);
2858 }
2859 if(val != 0x04000000) {lineno = __LINE__; goto eRR;}
2860
2861 // AVR_RESET(0x00)
2862 status = jtagmkII_avr32_reset(pgm, 0x00, 0x01, 0x07);
2863 if(status < 0) {lineno = __LINE__; goto eRR;}
2864 }
2865// if(flags & (AVR32_RESET_READ | AVR32_RESET_WRITE))
2866 {
2867 for(j=0; j<2; ++j) {
2868 val = jtagmkII_read_SABaddr(pgm, AVR32_DS, 0x01);
2869 if(val == ERROR_SAB) {lineno = __LINE__; goto eRR;}
2870 if((val&0x05000020) != 0x05000020) {lineno = __LINE__; goto eRR;}
2871 }
2872 }
2873
2874 //if(flags & (AVR32_RESET_READ | AVR32_RESET_WRITE | AVR32_RESET_CHIP_ERASE))
2875 {
2876 status = jtagmkII_write_SABaddr(pgm, AVR32_DINST, 0x01, 0xe7b00044); // mtdr 272, R0
2877 if(status < 0) {lineno = __LINE__; goto eRR;}
2878
2879 val = jtagmkII_read_SABaddr(pgm, AVR32_DCSR, 0x01);
2880 if(val != 0x00000001) {lineno = __LINE__; goto eRR;}
2881
2883 if(val != 0x00000000) {lineno = __LINE__; goto eRR;}
2884 }
2885
2886 // Read chip configuration - common for all
2888 for(j=0; j<2; ++j) {
2889 val = jtagmkII_read_SABaddr(pgm, AVR32_DS, 0x01);
2890 if(val == ERROR_SAB) {lineno = __LINE__; goto eRR;}
2891 if((val&0x05000020) != 0x05000020) {lineno = __LINE__; goto eRR;}
2892 }
2893
2894 status = jtagmkII_write_SABaddr(pgm, AVR32_DINST, 0x01, 0xe7b00044); // mtdr 272, R0
2895 if(status < 0) {lineno = __LINE__; goto eRR;}
2896
2897 val = jtagmkII_read_SABaddr(pgm, AVR32_DCSR, 0x01);
2898 if(val != 0x00000001) {lineno = __LINE__; goto eRR;}
2899
2901 if(val != 0x00000000) {lineno = __LINE__; goto eRR;}
2902
2903 status = jtagmkII_write_SABaddr(pgm, AVR32_DINST, 0x01, 0xe1b00040); // mfsr R0, 256
2904 if(status < 0) {lineno = __LINE__; goto eRR;}
2905
2906 status = jtagmkII_write_SABaddr(pgm, AVR32_DINST, 0x01, 0xe7b00044); // mtdr 272, R0
2907 if(status < 0) {lineno = __LINE__; goto eRR;}
2908
2909 val = jtagmkII_read_SABaddr(pgm, AVR32_DCSR, 0x01);
2910 if(val != 0x00000001) {lineno = __LINE__; goto eRR;}
2911
2913 if(val == ERROR_SAB) {lineno = __LINE__; goto eRR;}
2914
2915 status = jtagmkII_write_SABaddr(pgm, AVR32_DCEMU, 0x01, 0x00000000);
2916 if(status < 0) {lineno = __LINE__; goto eRR;}
2917
2918 status = jtagmkII_write_SABaddr(pgm, AVR32_DINST, 0x01, 0xe5b00045); // mtdr R0, 276
2919 if(status < 0) {lineno = __LINE__; goto eRR;}
2920
2921 val = jtagmkII_read_SABaddr(pgm, AVR32_DS, 0x01);
2922 if(val == ERROR_SAB) {lineno = __LINE__; goto eRR;}
2923 if((val&0x05000020) != 0x05000020) {lineno = __LINE__; goto eRR;}
2924
2925 status = jtagmkII_write_SABaddr(pgm, AVR32_DINST, 0x01, 0xe7b00044); // mtdr 272, R0
2926 if(status < 0) {lineno = __LINE__; goto eRR;}
2927
2928 val = jtagmkII_read_SABaddr(pgm, AVR32_DCSR, 0x01);
2929 if(val != 0x00000001) {lineno = __LINE__; goto eRR;}
2930
2932 if(val != 0x00000000) {lineno = __LINE__; goto eRR;}
2933
2934 status = jtagmkII_write_SABaddr(pgm, AVR32_DINST, 0x01, 0xe1b00041); // mfsr R0, 260
2935 if(status < 0) {lineno = __LINE__; goto eRR;}
2936 status = jtagmkII_write_SABaddr(pgm, AVR32_DINST, 0x01, 0xe7b00044); // mtdr 272, R0
2937 if(status < 0) {lineno = __LINE__; goto eRR;}
2938
2939 val = jtagmkII_read_SABaddr(pgm, AVR32_DCSR, 0x01);
2940 if(val != 0x00000001) {lineno = __LINE__; goto eRR;}
2942 if(val == ERROR_SAB) {lineno = __LINE__; goto eRR;}
2943
2944 status = jtagmkII_write_SABaddr(pgm, AVR32_DCEMU, 0x01, 0x00000000);
2945 if(status < 0) {lineno = __LINE__; goto eRR;}
2946 status = jtagmkII_write_SABaddr(pgm, AVR32_DINST, 0x01, 0xe5b00045); // mtdr R0, 276
2947 if(status < 0) {lineno = __LINE__; goto eRR;}
2948
2949 val = jtagmkII_read_SABaddr(pgm, 0x00000010, 0x06); // need to recheck who does this...
2950 if(val != 0x00000000) {lineno = __LINE__; goto eRR;}
2951 }
2952
2953 if(flags & AVR32_RESET_CHIP_ERASE) {
2954 status = jtagmkII_avr32_reset(pgm, 0x1f, 0x01, 0x00);
2955 if(status < 0) {lineno = __LINE__; goto eRR;}
2956 status = jtagmkII_avr32_reset(pgm, 0x01, 0x11, 0x1f);
2957 if(status < 0) {lineno = __LINE__; goto eRR;}
2958 }
2959
2960 if(flags & AVR32_SET4RUNNING) {
2961 status = jtagmkII_write_SABaddr(pgm, AVR32_DINST, 0x01, 0xe1b00014); // mfsr R0, 80
2962 if(status < 0) {lineno = __LINE__; goto eRR;}
2963
2964 status = jtagmkII_write_SABaddr(pgm, AVR32_DINST, 0x01, 0xe7b00044); // mtdr 272, R0
2965 if(status < 0) {lineno = __LINE__; goto eRR;}
2966
2967 val = jtagmkII_read_SABaddr(pgm, AVR32_DCSR, 0x01);
2968 if(val != 0x00000001) {lineno = __LINE__; goto eRR;}
2969
2971 if(val == ERROR_SAB) {lineno = __LINE__; goto eRR;}
2972
2973 status = jtagmkII_write_SABaddr(pgm, AVR32_DCEMU, 0x01, 0x00000000);
2974 if(status < 0) {lineno = __LINE__; goto eRR;}
2975
2976 status = jtagmkII_write_SABaddr(pgm, AVR32_DINST, 0x01, 0xe5b00045); // mfdr R0, 276
2977 if(status < 0) {lineno = __LINE__; goto eRR;}
2978
2979 val = jtagmkII_read_SABaddr(pgm, AVR32_DS, 0x01);
2980 if(val == ERROR_SAB) {lineno = __LINE__; goto eRR;}
2981 if((val&0x05000020) != 0x05000020) {lineno = __LINE__; goto eRR;}
2982
2983 status = jtagmkII_write_SABaddr(pgm, AVR32_DINST, 0x01, 0xd623d703); // retd
2984 if(status < 0) {lineno = __LINE__; goto eRR;}
2985 }
2986
2987 return 0;
2988
2989 eRR:
2990 avrdude_message(MSG_INFO, "%s: jtagmkII_reset32(): "
2991 "failed at line %d (status=%x val=%lx)\n",
2992 progname, lineno, status, val);
2993 return -1;
2994}
#define AVR32_DC_RESET
Definition jtagmkII_private.h:291
#define AVR32_DS
Definition jtagmkII_private.h:284
#define AVR32_DINST
Definition jtagmkII_private.h:285
#define AVR32_DCSR
Definition jtagmkII_private.h:288
#define AVR32_DCEMU
Definition jtagmkII_private.h:287
#define AVR32_DC
Definition jtagmkII_private.h:283
#define AVR32_DCCPU
Definition jtagmkII_private.h:286
#define AVR32_DC_ABORT
Definition jtagmkII_private.h:290
#define AVR32_DC_DBE
Definition jtagmkII_private.h:292
#define AVR32_DC_DBR
Definition jtagmkII_private.h:293

References AVR32_DC, AVR32_DC_ABORT, AVR32_DC_DBE, AVR32_DC_DBR, AVR32_DC_RESET, AVR32_DCCPU, AVR32_DCEMU, AVR32_DCSR, AVR32_DINST, AVR32_DS, AVR32_RESET_CHIP_ERASE, AVR32_RESET_READ, AVR32_RESET_WRITE, AVR32_SET4RUNNING, avrdude_message(), CMND_GET_IR, ERROR_SAB, jtagmkII_avr32_reset(), jtagmkII_read_SABaddr(), jtagmkII_recv(), jtagmkII_send(), jtagmkII_write_SABaddr(), lineno, MSG_INFO, MSG_NOTICE, pgm, and progname.

Referenced by jtagmkII_chip_erase32(), jtagmkII_paged_load32(), and jtagmkII_paged_write32().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_send()

int jtagmkII_send ( PROGRAMMER pgm,
unsigned char *  data,
size_t  len 
)
424{
425 unsigned char *buf;
426
427 avrdude_message(MSG_DEBUG, "\n%s: jtagmkII_send(): sending %lu bytes\n",
428 progname, (unsigned long)len);
429
430 if ((buf = malloc(len + 10)) == NULL)
431 {
432 avrdude_message(MSG_INFO, "%s: jtagmkII_send(): out of memory",
433 progname);
434 return -1;
435 }
436
437 buf[0] = MESSAGE_START;
438 u16_to_b2(buf + 1, PDATA(pgm)->command_sequence);
439 u32_to_b4(buf + 3, len);
440 buf[7] = TOKEN;
441 memcpy(buf + 8, data, len);
442
443 crcappend(buf, len + 8);
444
445 if (serial_send(&pgm->fd, buf, len + 10) != 0) {
446 avrdude_message(MSG_INFO, "%s: jtagmkII_send(): failed to send command to serial port\n",
447 progname);
448 free(buf);
449 return -1;
450 }
451
452 free(buf);
453
454 return 0;
455}
void crcappend(unsigned char *message, unsigned long length)
Definition crc16.c:76
#define TOKEN
Definition jtag3_private.h:91
static void u16_to_b2(unsigned char *b, unsigned short l)
Definition jtagmkII.c:243
#define serial_send
Definition libavrdude.h:577

References avrdude_message(), crcappend(), programmer_t::fd, free(), malloc(), MESSAGE_START, MSG_DEBUG, MSG_INFO, PDATA, pgm, progname, serial_send, TOKEN, u16_to_b2(), and u32_to_b4().

Referenced by jtagmkII_avr32_reset(), jtagmkII_chip_erase(), jtagmkII_chip_erase32(), jtagmkII_close(), jtagmkII_close32(), jtagmkII_getparm(), jtagmkII_getsync(), jtagmkII_initialize32(), jtagmkII_open32(), jtagmkII_page_erase(), jtagmkII_paged_load(), jtagmkII_paged_load32(), jtagmkII_paged_write(), jtagmkII_paged_write32(), jtagmkII_program_disable(), jtagmkII_program_enable(), jtagmkII_read_byte(), jtagmkII_read_SABaddr(), jtagmkII_reset(), jtagmkII_reset32(), jtagmkII_set_devdescr(), jtagmkII_set_xmega_params(), jtagmkII_setparm(), jtagmkII_write_byte(), and jtagmkII_write_SABaddr().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_set_devdescr()

static void jtagmkII_set_devdescr ( PROGRAMMER pgm,
AVRPART p 
)
static
948{
949 int status;
950 unsigned char *resp, c;
951 LNODEID ln;
952 AVRMEM * m;
953 struct {
954 unsigned char cmd;
955 struct device_descriptor dd;
956 } sendbuf;
957
958 memset(&sendbuf, 0, sizeof sendbuf);
959 sendbuf.cmd = CMND_SET_DEVICE_DESCRIPTOR;
960 sendbuf.dd.ucSPMCRAddress = p->spmcr;
961 sendbuf.dd.ucRAMPZAddress = p->rampz;
962 sendbuf.dd.ucIDRAddress = p->idr;
963 u16_to_b2(sendbuf.dd.EECRAddress, p->eecr);
964 sendbuf.dd.ucAllowFullPageBitstream =
966 sendbuf.dd.EnablePageProgramming =
968 for (ln = lfirst(p->mem); ln; ln = lnext(ln)) {
969 m = ldata(ln);
970 if (strcmp(m->desc, "flash") == 0) {
971 if (m->page_size > 256)
972 PDATA(pgm)->flash_pagesize = 256;
973 else
974 PDATA(pgm)->flash_pagesize = m->page_size;
975 u32_to_b4(sendbuf.dd.ulFlashSize, m->size);
976 u16_to_b2(sendbuf.dd.uiFlashPageSize, m->page_size);
977 u16_to_b2(sendbuf.dd.uiFlashpages, m->size / m->page_size);
978 if (p->flags & AVRPART_HAS_DW) {
979 memcpy(sendbuf.dd.ucFlashInst, p->flash_instr, FLASH_INSTR_SIZE);
980 memcpy(sendbuf.dd.ucEepromInst, p->eeprom_instr, EEPROM_INSTR_SIZE);
981 }
982 } else if (strcmp(m->desc, "eeprom") == 0) {
983 sendbuf.dd.ucEepromPageSize = PDATA(pgm)->eeprom_pagesize = m->page_size;
984 }
985 }
986 sendbuf.dd.ucCacheType =
987 (p->flags & AVRPART_HAS_PDI)? 0x02 /* ATxmega */: 0x00;
988
989 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_set_devdescr(): "
990 "Sending set device descriptor command: ",
991 progname);
992 jtagmkII_send(pgm, (unsigned char *)&sendbuf,
993 PDATA(pgm)->device_descriptor_length + sizeof(unsigned char));
994
995 status = jtagmkII_recv(pgm, &resp);
996 if (status <= 0) {
997 if (verbose >= 2)
998 putc('\n', stderr);
999 avrdude_message(MSG_INFO, "%s: jtagmkII_set_devdescr(): "
1000 "timeout/error communicating with programmer (status %d)\n",
1001 progname, status);
1002 return;
1003 }
1004 if (verbose >= 3) {
1005 putc('\n', stderr);
1006 jtagmkII_prmsg(pgm, resp, status);
1007 } else if (verbose == 2)
1008 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
1009 c = resp[0];
1010 free(resp);
1011 if (c != RSP_OK) {
1012 avrdude_message(MSG_INFO, "%s: jtagmkII_set_devdescr(): "
1013 "bad response to set device descriptor command: %s\n",
1015 }
1016}
#define CMND_SET_DEVICE_DESCRIPTOR
Definition jtagmkII_private.h:89
unsigned char idr
Definition libavrdude.h:267
unsigned char eeprom_instr[EEPROM_INSTR_SIZE]
Definition libavrdude.h:246
#define AVRPART_ALLOWFULLPAGEBITSTREAM
Definition libavrdude.h:199
unsigned short eecr
Definition libavrdude.h:270
int size
Definition libavrdude.h:286
#define EEPROM_INSTR_SIZE
Definition libavrdude.h:213
unsigned char rampz
Definition libavrdude.h:268
#define FLASH_INSTR_SIZE
Definition libavrdude.h:212
unsigned char flash_instr[FLASH_INSTR_SIZE]
Definition libavrdude.h:245
#define AVRPART_ENABLEPAGEPROGRAMMING
Definition libavrdude.h:200
unsigned char spmcr
Definition libavrdude.h:269
LISTID mem
Definition libavrdude.h:277

References avrdude_message(), AVRPART_ALLOWFULLPAGEBITSTREAM, AVRPART_ENABLEPAGEPROGRAMMING, AVRPART_HAS_DW, AVRPART_HAS_PDI, cmd, CMND_SET_DEVICE_DESCRIPTOR, avrmem::desc, avrpart::eecr, avrpart::eeprom_instr, EEPROM_INSTR_SIZE, avrpart::flags, avrpart::flash_instr, FLASH_INSTR_SIZE, free(), avrpart::idr, jtagmkII_get_rc(), jtagmkII_prmsg(), jtagmkII_recv(), jtagmkII_send(), ldata(), lfirst(), lnext(), avrpart::mem, MSG_INFO, MSG_NOTICE2, avrmem::page_size, PDATA, pgm, progname, avrpart::rampz, RSP_OK, avrmem::size, avrpart::spmcr, u16_to_b2(), u32_to_b4(), and verbose.

Referenced by jtagmkII_initialize().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_set_sck_period()

static int jtagmkII_set_sck_period ( PROGRAMMER pgm,
double  v 
)
static
2525{
2526 unsigned char dur;
2527
2528 v = 1 / v; /* convert to frequency */
2529 if (v >= 6.4e6)
2530 dur = 0;
2531 else if (v >= 2.8e6)
2532 dur = 1;
2533 else if (v >= 20.9e3)
2534 dur = (unsigned char)(5.35e6 / v);
2535 else
2536 dur = 255;
2537
2538 return jtagmkII_setparm(pgm, PAR_OCD_JTAG_CLK, &dur);
2539}

References jtagmkII_setparm(), PAR_OCD_JTAG_CLK, and pgm.

Referenced by jtagmkII_dragon_initpgm(), jtagmkII_initialize(), and jtagmkII_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_set_xmega_params()

static void jtagmkII_set_xmega_params ( PROGRAMMER pgm,
AVRPART p 
)
static
1019{
1020 int status;
1021 unsigned char *resp, c;
1022 LNODEID ln;
1023 AVRMEM * m;
1024 struct {
1025 unsigned char cmd;
1026 struct xmega_device_desc dd;
1027 } sendbuf;
1028
1029 memset(&sendbuf, 0, sizeof sendbuf);
1030 sendbuf.cmd = CMND_SET_XMEGA_PARAMS;
1031 u16_to_b2(sendbuf.dd.whatever, 0x0002);
1032 sendbuf.dd.datalen = 47;
1033 u16_to_b2(sendbuf.dd.nvm_base_addr, p->nvm_base);
1034 u16_to_b2(sendbuf.dd.mcu_base_addr, p->mcu_base);
1035
1036 for (ln = lfirst(p->mem); ln; ln = lnext(ln)) {
1037 m = ldata(ln);
1038 if (strcmp(m->desc, "flash") == 0) {
1039 if (m->page_size > 256)
1040 PDATA(pgm)->flash_pagesize = 256;
1041 else
1042 PDATA(pgm)->flash_pagesize = m->page_size;
1043 u16_to_b2(sendbuf.dd.flash_page_size, m->page_size);
1044 } else if (strcmp(m->desc, "eeprom") == 0) {
1045 sendbuf.dd.eeprom_page_size = m->page_size;
1046 u16_to_b2(sendbuf.dd.eeprom_size, m->size);
1047 u32_to_b4(sendbuf.dd.nvm_eeprom_offset, m->offset);
1048 } else if (strcmp(m->desc, "application") == 0) {
1049 u32_to_b4(sendbuf.dd.app_size, m->size);
1050 u32_to_b4(sendbuf.dd.nvm_app_offset, m->offset);
1051 } else if (strcmp(m->desc, "boot") == 0) {
1052 u16_to_b2(sendbuf.dd.boot_size, m->size);
1053 u32_to_b4(sendbuf.dd.nvm_boot_offset, m->offset);
1054 } else if (strcmp(m->desc, "fuse1") == 0) {
1055 u32_to_b4(sendbuf.dd.nvm_fuse_offset, m->offset & ~7);
1056 } else if (strncmp(m->desc, "lock", 4) == 0) {
1057 u32_to_b4(sendbuf.dd.nvm_lock_offset, m->offset);
1058 } else if (strcmp(m->desc, "usersig") == 0) {
1059 u32_to_b4(sendbuf.dd.nvm_user_sig_offset, m->offset);
1060 } else if (strcmp(m->desc, "prodsig") == 0) {
1061 u32_to_b4(sendbuf.dd.nvm_prod_sig_offset, m->offset);
1062 } else if (strcmp(m->desc, "data") == 0) {
1063 u32_to_b4(sendbuf.dd.nvm_data_offset, m->offset);
1064 }
1065 }
1066
1067 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_set_xmega_params(): "
1068 "Sending set Xmega params command: ",
1069 progname);
1070 jtagmkII_send(pgm, (unsigned char *)&sendbuf, sizeof sendbuf);
1071
1072 status = jtagmkII_recv(pgm, &resp);
1073 if (status <= 0) {
1074 if (verbose >= 2)
1075 putc('\n', stderr);
1076 avrdude_message(MSG_INFO, "%s: jtagmkII_set_xmega_params(): "
1077 "timeout/error communicating with programmer (status %d)\n",
1078 progname, status);
1079 return;
1080 }
1081 if (verbose >= 3) {
1082 putc('\n', stderr);
1083 jtagmkII_prmsg(pgm, resp, status);
1084 } else if (verbose == 2)
1085 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
1086 c = resp[0];
1087 free(resp);
1088 if (c != RSP_OK) {
1089 avrdude_message(MSG_INFO, "%s: jtagmkII_set_xmega_params(): "
1090 "bad response to set device descriptor command: %s\n",
1092 }
1093}
#define CMND_SET_XMEGA_PARAMS
Definition jtagmkII_private.h:113
Definition jtag3_private.h:292
unsigned int nvm_base
Definition libavrdude.h:272
unsigned int mcu_base
Definition libavrdude.h:271

References avrdude_message(), cmd, CMND_SET_XMEGA_PARAMS, avrmem::desc, free(), jtagmkII_get_rc(), jtagmkII_prmsg(), jtagmkII_recv(), jtagmkII_send(), ldata(), lfirst(), lnext(), avrpart::mcu_base, avrpart::mem, MSG_INFO, MSG_NOTICE2, avrpart::nvm_base, avrmem::offset, avrmem::page_size, PDATA, pgm, progname, RSP_OK, avrmem::size, u16_to_b2(), u32_to_b4(), and verbose.

Referenced by jtagmkII_initialize().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_setparm()

static int jtagmkII_setparm ( PROGRAMMER pgm,
unsigned char  parm,
unsigned char *  value 
)
static
2596{
2597 int status;
2598 /*
2599 * As the maximal parameter length is 4 bytes, we use a fixed-length
2600 * buffer, as opposed to malloc()ing it.
2601 */
2602 unsigned char buf[2 + 4], *resp, c;
2603 size_t size;
2604
2605 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_setparm()\n", progname);
2606
2607 switch (parm) {
2608 case PAR_HW_VERSION: size = 2; break;
2609 case PAR_FW_VERSION: size = 4; break;
2610 case PAR_EMULATOR_MODE: size = 1; break;
2611 case PAR_BAUD_RATE: size = 1; break;
2612 case PAR_OCD_VTARGET: size = 2; break;
2613 case PAR_OCD_JTAG_CLK: size = 1; break;
2614 case PAR_TIMERS_RUNNING: size = 1; break;
2615 case PAR_EXTERNAL_RESET: size = 1; break;
2616 case PAR_DAISY_CHAIN_INFO: size = 4; break;
2618 case PAR_PDI_OFFSET_END: size = 4; break;
2619 default:
2620 avrdude_message(MSG_INFO, "%s: jtagmkII_setparm(): unknown parameter 0x%02x\n",
2621 progname, parm);
2622 return -1;
2623 }
2624
2625 buf[0] = CMND_SET_PARAMETER;
2626 buf[1] = parm;
2627 memcpy(buf + 2, value, size);
2628 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_setparm(): "
2629 "Sending set parameter command (parm 0x%02x, %u bytes): ",
2630 progname, parm, (unsigned)size);
2631 jtagmkII_send(pgm, buf, size + 2);
2632
2633 status = jtagmkII_recv(pgm, &resp);
2634 if (status <= 0) {
2635 if (verbose >= 2)
2636 putc('\n', stderr);
2637 avrdude_message(MSG_INFO, "%s: jtagmkII_setparm(): "
2638 "timeout/error communicating with programmer (status %d)\n",
2639 progname, status);
2640 return -1;
2641 }
2642 if (verbose >= 3) {
2643 putc('\n', stderr);
2644 jtagmkII_prmsg(pgm, resp, status);
2645 } else if (verbose == 2)
2646 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
2647 c = resp[0];
2648 free(resp);
2649 if (c != RSP_OK) {
2650 avrdude_message(MSG_INFO, "%s: jtagmkII_setparm(): "
2651 "bad response to set parameter command: %s\n",
2653 return -1;
2654 }
2655
2656 return 0;
2657}
constexpr auto size(const C &c) -> decltype(c.size())
Definition span.hpp:183

References avrdude_message(), CMND_SET_PARAMETER, free(), jtagmkII_get_rc(), jtagmkII_prmsg(), jtagmkII_recv(), jtagmkII_send(), MSG_INFO, MSG_NOTICE2, PAR_BAUD_RATE, PAR_DAISY_CHAIN_INFO, PAR_EMULATOR_MODE, PAR_EXTERNAL_RESET, PAR_FW_VERSION, PAR_HW_VERSION, PAR_OCD_JTAG_CLK, PAR_OCD_VTARGET, PAR_PDI_OFFSET_END, PAR_PDI_OFFSET_START, PAR_TIMERS_RUNNING, pgm, progname, RSP_OK, and verbose.

Referenced by jtagmkII_getsync(), jtagmkII_initialize(), jtagmkII_initialize32(), jtagmkII_program_enable(), jtagmkII_reset(), and jtagmkII_set_sck_period().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_setup()

void jtagmkII_setup ( PROGRAMMER pgm)
177{
178 if ((pgm->cookie = malloc(sizeof(struct pdata))) == 0) {
179 avrdude_message(MSG_INFO, "%s: jtagmkII_setup(): Out of memory allocating private data\n",
180 progname);
181 exit(1);
182 }
183 memset(pgm->cookie, 0, sizeof(struct pdata));
184}
Definition avr910.c:50
void * cookie
Definition libavrdude.h:689

References avrdude_message(), programmer_t::cookie, malloc(), MSG_INFO, pgm, and progname.

Referenced by jtagmkII_avr32_initpgm(), jtagmkII_dragon_dw_initpgm(), jtagmkII_dragon_initpgm(), jtagmkII_dragon_pdi_initpgm(), jtagmkII_dw_initpgm(), jtagmkII_initpgm(), and jtagmkII_pdi_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_smc_init32()

static int jtagmkII_smc_init32 ( PROGRAMMER pgm)
static
2997{
2998 int status, lineno;
2999 unsigned long val;
3000
3001 // HMATRIX 0xFFFF1000
3002 status = jtagmkII_write_SABaddr(pgm, 0xffff1018, 0x05, 0x04000000);
3003 if (status < 0) {lineno = __LINE__; goto eRR;}
3004 status = jtagmkII_write_SABaddr(pgm, 0xffff1024, 0x05, 0x04000000);
3005 if (status < 0) {lineno = __LINE__; goto eRR;}
3006 status = jtagmkII_write_SABaddr(pgm, 0xffff1008, 0x05, 0x04000000);
3007 if (status < 0) {lineno = __LINE__; goto eRR;}
3008 status = jtagmkII_write_SABaddr(pgm, 0xffff1078, 0x05, 0x04000000);
3009 if (status < 0) {lineno = __LINE__; goto eRR;}
3010 status = jtagmkII_write_SABaddr(pgm, 0xffff1088, 0x05, 0x04000000);
3011 if (status < 0) {lineno = __LINE__; goto eRR;}
3012
3013 status = jtagmkII_write_SABaddr(pgm, 0xffff1018, 0x05, 0x08000000);
3014 if (status < 0) {lineno = __LINE__; goto eRR;}
3015 status = jtagmkII_write_SABaddr(pgm, 0xffff1024, 0x05, 0x08000000);
3016 if (status < 0) {lineno = __LINE__; goto eRR;}
3017 status = jtagmkII_write_SABaddr(pgm, 0xffff1008, 0x05, 0x08000000);
3018 if (status < 0) {lineno = __LINE__; goto eRR;}
3019 status = jtagmkII_write_SABaddr(pgm, 0xffff1078, 0x05, 0x08000000);
3020 if (status < 0) {lineno = __LINE__; goto eRR;}
3021 status = jtagmkII_write_SABaddr(pgm, 0xffff1088, 0x05, 0x08000000);
3022 if (status < 0) {lineno = __LINE__; goto eRR;}
3023
3024 status = jtagmkII_write_SABaddr(pgm, 0xffff1018, 0x05, 0x10000000);
3025 if (status < 0) {lineno = __LINE__; goto eRR;}
3026 status = jtagmkII_write_SABaddr(pgm, 0xffff1024, 0x05, 0x10000000);
3027 if (status < 0) {lineno = __LINE__; goto eRR;}
3028 status = jtagmkII_write_SABaddr(pgm, 0xffff1008, 0x05, 0x10000000);
3029 if (status < 0) {lineno = __LINE__; goto eRR;}
3030 status = jtagmkII_write_SABaddr(pgm, 0xffff1078, 0x05, 0x10000000);
3031 if (status < 0) {lineno = __LINE__; goto eRR;}
3032 status = jtagmkII_write_SABaddr(pgm, 0xffff1088, 0x05, 0x10000000);
3033 if (status < 0) {lineno = __LINE__; goto eRR;}
3034
3035 status = jtagmkII_write_SABaddr(pgm, 0xffff1018, 0x05, 0x00020000);
3036 if (status < 0) {lineno = __LINE__; goto eRR;}
3037 status = jtagmkII_write_SABaddr(pgm, 0xffff1024, 0x05, 0x00020000);
3038 if (status < 0) {lineno = __LINE__; goto eRR;}
3039 status = jtagmkII_write_SABaddr(pgm, 0xffff1008, 0x05, 0x00020000);
3040 if (status < 0) {lineno = __LINE__; goto eRR;}
3041 status = jtagmkII_write_SABaddr(pgm, 0xffff1078, 0x05, 0x00020000);
3042 if (status < 0) {lineno = __LINE__; goto eRR;}
3043 status = jtagmkII_write_SABaddr(pgm, 0xffff1088, 0x05, 0x00020000);
3044 if (status < 0) {lineno = __LINE__; goto eRR;}
3045
3046 status = jtagmkII_write_SABaddr(pgm, 0xffff1018, 0x05, 0x02000000);
3047 if (status < 0) {lineno = __LINE__; goto eRR;}
3048 status = jtagmkII_write_SABaddr(pgm, 0xffff1024, 0x05, 0x02000000);
3049 if (status < 0) {lineno = __LINE__; goto eRR;}
3050 status = jtagmkII_write_SABaddr(pgm, 0xffff1008, 0x05, 0x02000000);
3051 if (status < 0) {lineno = __LINE__; goto eRR;}
3052 status = jtagmkII_write_SABaddr(pgm, 0xffff1078, 0x05, 0x02000000);
3053 if (status < 0) {lineno = __LINE__; goto eRR;}
3054 status = jtagmkII_write_SABaddr(pgm, 0xffff1088, 0x05, 0x02000000);
3055 if (status < 0) {lineno = __LINE__; goto eRR;}
3056
3057 status = jtagmkII_write_SABaddr(pgm, 0xfffe1c00, 0x05, 0x00010001);
3058 if (status < 0) {lineno = __LINE__; goto eRR;}
3059 status = jtagmkII_write_SABaddr(pgm, 0xfffe1c04, 0x05, 0x05070a0b);
3060 if (status < 0) {lineno = __LINE__; goto eRR;}
3061 status = jtagmkII_write_SABaddr(pgm, 0xfffe1c08, 0x05, 0x000b000c);
3062 if (status < 0) {lineno = __LINE__; goto eRR;}
3063 status = jtagmkII_write_SABaddr(pgm, 0xfffe1c0c, 0x05, 0x00031103);
3064 if (status < 0) {lineno = __LINE__; goto eRR;}
3065
3066 // switchToClockSource
3067 val = jtagmkII_read_SABaddr(pgm, 0xffff0c28, 0x05);
3068 if (val != 0x00000000) {lineno = __LINE__; goto eRR;} // OSC 0
3069 status = jtagmkII_write_SABaddr(pgm, 0xffff0c28, 0x05, 0x0000607);
3070 if (status < 0) {lineno = __LINE__; goto eRR;}
3071 val = jtagmkII_read_SABaddr(pgm, 0xffff0c00, 0x05);
3072 if (val != 0x00000000) {lineno = __LINE__; goto eRR;} // PLL 0
3073 status = jtagmkII_write_SABaddr(pgm, 0xffff0c00, 0x05, 0x0000004);
3074 if (status < 0) {lineno = __LINE__; goto eRR;} // Power Manager
3075 status = jtagmkII_write_SABaddr(pgm, 0xffff0c00, 0x05, 0x0000005);
3076 if (status < 0) {lineno = __LINE__; goto eRR;}
3077
3078 usleep(1000000);
3079
3080 val = jtagmkII_read_SABaddr(pgm, 0xfffe1408, 0x05);
3081 if (val != 0x0000a001) {lineno = __LINE__; goto eRR;} // PLL 0
3082
3083 // need a small delay to let clock stabliize
3084 usleep(50*1000);
3085
3086 return 0;
3087
3088 eRR:
3089 avrdude_message(MSG_INFO, "%s: jtagmkII_smc_init32(): "
3090 "failed at line %d\n",
3091 progname, lineno);
3092 return -1;
3093}
int usleep(unsigned usec)
Definition unistd.cpp:13

References avrdude_message(), jtagmkII_read_SABaddr(), jtagmkII_write_SABaddr(), lineno, MSG_INFO, pgm, progname, and usleep().

Referenced by jtagmkII_paged_load32(), and jtagmkII_paged_write32().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_teardown()

void jtagmkII_teardown ( PROGRAMMER pgm)
187{
188 free(pgm->cookie);
189}

References programmer_t::cookie, free(), and pgm.

Referenced by jtagmkII_avr32_initpgm(), jtagmkII_dragon_dw_initpgm(), jtagmkII_dragon_initpgm(), jtagmkII_dragon_pdi_initpgm(), jtagmkII_dw_initpgm(), jtagmkII_initpgm(), and jtagmkII_pdi_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_write_byte()

static int jtagmkII_write_byte ( PROGRAMMER pgm,
AVRPART p,
AVRMEM mem,
unsigned long  addr,
unsigned char  data 
)
static
2394{
2395 unsigned char cmd[12];
2396 unsigned char *resp = NULL, writedata, writedata2 = 0xFF;
2397 int status, tries, need_progmode = 1, unsupp = 0, writesize = 1;
2398
2399 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_write_byte(.., %s, 0x%lx, ...)\n",
2400 progname, mem->desc, addr);
2401
2402 addr += mem->offset;
2403
2404 writedata = data;
2406 cmd[1] = ( p->flags & AVRPART_HAS_PDI ) ? MTYPE_FLASH : MTYPE_SPM;
2407 if (strcmp(mem->desc, "flash") == 0) {
2408 if ((addr & 1) == 1) {
2409 /* odd address = high byte */
2410 writedata = 0xFF; /* don't modify the low byte */
2411 writedata2 = data;
2412 addr &= ~1L;
2413 }
2414 writesize = 2;
2415 need_progmode = 0;
2416 PDATA(pgm)->flash_pageaddr = (unsigned long)-1L;
2417 if (pgm->flag & PGM_FL_IS_DW)
2418 unsupp = 1;
2419 } else if (strcmp(mem->desc, "eeprom") == 0) {
2421 need_progmode = 0;
2422 PDATA(pgm)->eeprom_pageaddr = (unsigned long)-1L;
2423 } else if (strcmp(mem->desc, "lfuse") == 0) {
2424 cmd[1] = MTYPE_FUSE_BITS;
2425 addr = 0;
2426 if (pgm->flag & PGM_FL_IS_DW)
2427 unsupp = 1;
2428 } else if (strcmp(mem->desc, "hfuse") == 0) {
2429 cmd[1] = MTYPE_FUSE_BITS;
2430 addr = 1;
2431 if (pgm->flag & PGM_FL_IS_DW)
2432 unsupp = 1;
2433 } else if (strcmp(mem->desc, "efuse") == 0) {
2434 cmd[1] = MTYPE_FUSE_BITS;
2435 addr = 2;
2436 if (pgm->flag & PGM_FL_IS_DW)
2437 unsupp = 1;
2438 } else if (strncmp(mem->desc, "fuse", strlen("fuse")) == 0) {
2439 cmd[1] = MTYPE_FUSE_BITS;
2440 } else if (strcmp(mem->desc, "usersig") == 0) {
2441 cmd[1] = MTYPE_USERSIG;
2442 } else if (strcmp(mem->desc, "prodsig") == 0) {
2443 cmd[1] = MTYPE_PRODSIG;
2444 } else if (strncmp(mem->desc, "lock", 4) == 0) {
2445 cmd[1] = MTYPE_LOCK_BITS;
2446 if (pgm->flag & PGM_FL_IS_DW)
2447 unsupp = 1;
2448 } else if (strcmp(mem->desc, "calibration") == 0) {
2450 if (pgm->flag & PGM_FL_IS_DW)
2451 unsupp = 1;
2452 } else if (strcmp(mem->desc, "signature") == 0) {
2453 cmd[1] = MTYPE_SIGN_JTAG;
2454 if (pgm->flag & PGM_FL_IS_DW)
2455 unsupp = 1;
2456 }
2457
2458 if (unsupp)
2459 return -1;
2460
2461 if (need_progmode) {
2463 return -1;
2464 } else {
2466 return -1;
2467 }
2468
2469 u32_to_b4(cmd + 2, writesize);
2470 u32_to_b4(cmd + 6, addr);
2471 cmd[10] = writedata;
2472 cmd[11] = writedata2;
2473
2474 tries = 0;
2475 retry:
2476 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_write_byte(): Sending write memory command: ",
2477 progname);
2478 jtagmkII_send(pgm, cmd, 10 + writesize);
2479
2480 status = jtagmkII_recv(pgm, &resp);
2481 if (status <= 0) {
2482 if (verbose >= 2)
2483 putc('\n', stderr);
2484 avrdude_message(MSG_NOTICE2, "%s: jtagmkII_write_byte(): "
2485 "timeout/error communicating with programmer (status %d)\n",
2486 progname, status);
2487 if (tries++ < 3)
2488 goto retry;
2489 avrdude_message(MSG_INFO, "%s: jtagmkII_write_byte(): "
2490 "fatal timeout/error communicating with programmer (status %d)\n",
2491 progname, status);
2492 goto fail;
2493 }
2494 if (verbose >= 3) {
2495 putc('\n', stderr);
2496 jtagmkII_prmsg(pgm, resp, status);
2497 } else if (verbose == 2)
2498 avrdude_message(MSG_NOTICE2, "0x%02x (%d bytes msg)\n", resp[0], status);
2499 if (resp[0] != RSP_OK) {
2500 avrdude_message(MSG_INFO, "%s: jtagmkII_write_byte(): "
2501 "bad response to write memory command: %s\n",
2502 progname, jtagmkII_get_rc(resp[0]));
2503 goto fail;
2504 }
2505
2506 free(resp);
2507 return 0;
2508
2509fail:
2510 free(resp);
2511 return -1;
2512}
#define MTYPE_EEPROM_XMEGA
Definition jtag3_private.h:165
constexpr auto data(C &c) -> decltype(c.data())
Definition span.hpp:195

References avrdude_message(), AVRPART_HAS_PDI, cmd, CMND_WRITE_MEMORY, avrmem::desc, programmer_t::flag, avrpart::flags, free(), jtagmkII_get_rc(), jtagmkII_prmsg(), jtagmkII_program_disable(), jtagmkII_program_enable(), jtagmkII_recv(), jtagmkII_send(), long, MSG_INFO, MSG_NOTICE2, MTYPE_EEPROM, MTYPE_EEPROM_XMEGA, MTYPE_FLASH, MTYPE_FUSE_BITS, MTYPE_LOCK_BITS, MTYPE_OSCCAL_BYTE, MTYPE_PRODSIG, MTYPE_SIGN_JTAG, MTYPE_SPM, MTYPE_USERSIG, avrmem::offset, PDATA, pgm, PGM_FL_IS_DW, progname, RSP_OK, u32_to_b4(), and verbose.

Referenced by jtagmkII_avr32_initpgm(), jtagmkII_dragon_dw_initpgm(), jtagmkII_dragon_initpgm(), jtagmkII_dragon_pdi_initpgm(), jtagmkII_dw_initpgm(), jtagmkII_initpgm(), jtagmkII_paged_write(), and jtagmkII_pdi_initpgm().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ jtagmkII_write_SABaddr()

static int jtagmkII_write_SABaddr ( PROGRAMMER pgm,
unsigned long  addr,
unsigned int  prefix,
unsigned long  val 
)
static
3301{
3302 unsigned char buf[10], *resp;
3303 int status;
3304
3305 buf[0] = CMND_WRITE_SAB;
3306 buf[1] = prefix;
3307 u32_to_b4r(&buf[2], addr);
3308 u32_to_b4r(&buf[6], val);
3309
3310 if(jtagmkII_send(pgm, buf, 10) < 0)
3311 return -1;
3312
3313 status = jtagmkII_recv(pgm, &resp);
3314 if(status <= 0 || resp[0] != RSP_OK) {
3315 if (verbose >= 2)
3316 putc('\n', stderr);
3317 avrdude_message(MSG_INFO, "%s: jtagmkII_write_SABaddr(): "
3318 "timeout/error communicating with programmer (status %d)\n",
3319 progname, status);
3320 return -1;
3321 }
3322
3323
3324 if (verbose) {
3325 if (verbose >= 2)
3326 putc('\n', stderr);
3327 avrdude_message(MSG_INFO, "%s: jtagmkII_write_SABaddr(): "
3328 "OCD Register %lx -> %4.4lx\n",
3329 progname, addr, val);
3330 }
3331 return 0;
3332}
#define CMND_WRITE_SAB
Definition jtagmkII_private.h:106

References avrdude_message(), CMND_WRITE_SAB, jtagmkII_recv(), jtagmkII_send(), MSG_INFO, pgm, progname, RSP_OK, u32_to_b4r(), and verbose.

Referenced by jtagmkII_flash_clear_pagebuffer32(), jtagmkII_flash_erase32(), jtagmkII_flash_lock32(), jtagmkII_flash_write_page32(), jtagmkII_reset32(), and jtagmkII_smc_init32().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ u16_to_b2()

static void u16_to_b2 ( unsigned char *  b,
unsigned short  l 
)
static
244{
245 b[0] = l & 0xff;
246 b[1] = (l >> 8) & 0xff;
247}

Referenced by jtagmkII_send(), jtagmkII_set_devdescr(), and jtagmkII_set_xmega_params().

+ Here is the caller graph for this function:

◆ u32_to_b4()

static void u32_to_b4 ( unsigned char *  b,
unsigned long  l 
)
static
217{
218 b[0] = l & 0xff;
219 b[1] = (l >> 8) & 0xff;
220 b[2] = (l >> 16) & 0xff;
221 b[3] = (l >> 24) & 0xff;
222}

Referenced by jtagmkII_initialize(), jtagmkII_page_erase(), jtagmkII_paged_load(), jtagmkII_paged_write(), jtagmkII_read_byte(), jtagmkII_send(), jtagmkII_set_devdescr(), jtagmkII_set_xmega_params(), and jtagmkII_write_byte().

+ Here is the caller graph for this function:

◆ u32_to_b4r()

static void u32_to_b4r ( unsigned char *  b,
unsigned long  l 
)
static
225{
226 b[3] = l & 0xff;
227 b[2] = (l >> 8) & 0xff;
228 b[1] = (l >> 16) & 0xff;
229 b[0] = (l >> 24) & 0xff;
230}

Referenced by jtagmkII_paged_load32(), jtagmkII_paged_write32(), jtagmkII_read_SABaddr(), and jtagmkII_write_SABaddr().

+ Here is the caller graph for this function:

Variable Documentation

◆ jtagmkII_avr32_desc

const char jtagmkII_avr32_desc[] = "Atmel JTAG ICE mkII in AVR32 mode"

◆ jtagmkII_desc

const char jtagmkII_desc[] = "Atmel JTAG ICE mkII"

◆ jtagmkII_dragon_desc

const char jtagmkII_dragon_desc[] = "Atmel AVR Dragon in JTAG mode"

◆ jtagmkII_dragon_dw_desc

const char jtagmkII_dragon_dw_desc[] = "Atmel AVR Dragon in debugWire mode"

◆ jtagmkII_dragon_pdi_desc

const char jtagmkII_dragon_pdi_desc[] = "Atmel AVR Dragon in PDI mode"

◆ jtagmkII_dw_desc

const char jtagmkII_dw_desc[] = "Atmel JTAG ICE mkII in debugWire mode"

◆ jtagmkII_pdi_desc

const char jtagmkII_pdi_desc[] = "Atmel JTAG ICE mkII in PDI mode"

◆ [struct]

struct { ... } jtagresults[]
Initial value:
= {
}

Referenced by jtagmkII_get_rc().