Skip to content

Commit

Permalink
Merge pull request #1587 from MCUdude/get_sck_vtarg
Browse files Browse the repository at this point in the history
Terminal sck command improvements
  • Loading branch information
stefanrueger authored Dec 18, 2023
2 parents ebd4597 + 092a94b commit 2bd6b56
Show file tree
Hide file tree
Showing 6 changed files with 185 additions and 55 deletions.
74 changes: 73 additions & 1 deletion src/jtag3.c
Original file line number Diff line number Diff line change
Expand Up @@ -2402,6 +2402,49 @@ static int jtag3_set_sck_period(const PROGRAMMER *pgm, double v) {
}


static int jtag3_get_sck_period(const PROGRAMMER *pgm, double *v) {
unsigned char conn, arch;
unsigned char buf[2];
*v = 0;

if (jtag3_getparm(pgm, SCOPE_AVR, 1, PARM3_CONNECTION, &conn, 1) < 0) {
pmsg_error("cannot obtain connection type\n");
return -1;
}
if (jtag3_getparm(pgm, SCOPE_AVR, 0, PARM3_ARCH, &arch, 1) < 0) {
pmsg_error("cannot obtain target architecture\n");
return -1;
}

if (conn == PARM3_CONN_JTAG) {
if (arch == PARM3_ARCH_XMEGA) {
if (jtag3_getparm(pgm, SCOPE_AVR, 1, PARM3_CLK_XMEGA_JTAG, buf, 2) < 0) {
pmsg_error("cannot read Xmega JTAG clock speed\n");
return -1;
}
} else {
if (jtag3_getparm(pgm, SCOPE_AVR, 1, PARM3_CLK_MEGA_PROG, buf, 2) < 0) {
pmsg_error("cannot read JTAG clock speed\n");
return -1;
}
}
} else if (conn & (PARM3_CONN_PDI | PARM3_CONN_UPDI)) {
if (jtag3_getparm(pgm, SCOPE_AVR, 1, PARM3_CLK_XMEGA_PDI, buf, 2) < 0) {
pmsg_error("cannot read PDI/UPDI clock speed\n");
return -1;
}
}

if (b2_to_u16(buf) <= 0) {
pmsg_error("cannot calculate programmer clock speed\n");
return -1;
}
*v = 1.0/(1000*b2_to_u16(buf));

return 0;
}


/*
* Read (an) emulator parameter(s).
*/
Expand Down Expand Up @@ -2499,7 +2542,7 @@ int jtag3_read_sib(const PROGRAMMER *pgm, const AVRPART *p, char *sib) {
return status;

memcpy(sib, resp+3, AVR_SIBLEN);
sib[AVR_SIBLEN] = 0; // Zero terminate string
sib[AVR_SIBLEN-1] = 0; // Zero terminate string
pmsg_debug("jtag3_read_sib(): received SIB: %s\n", sib);
free(resp);
return 0;
Expand Down Expand Up @@ -2549,6 +2592,18 @@ int jtag3_set_vtarget(const PROGRAMMER *pgm, double v) {
return 0;
}

int jtag3_get_vtarget(const PROGRAMMER *pgm, double *v) {
unsigned char buf[2];

if(jtag3_getparm(pgm, SCOPE_GENERAL, 1, PARM3_VTARGET, buf, 2) < 0) {
pmsg_error("cannot read target voltage\n");
return -1;
}

*v = b2_to_u16(buf)/1000.0;
return 0;
}

void jtag3_display(const PROGRAMMER *pgm, const char *p) {
unsigned char parms[5];
unsigned char *resp = NULL;
Expand Down Expand Up @@ -3212,6 +3267,7 @@ void jtag3_initpgm(PROGRAMMER *pgm) {
pgm->page_erase = jtag3_page_erase;
pgm->print_parms = jtag3_print_parms;
pgm->set_sck_period = jtag3_set_sck_period;
pgm->get_sck_period = jtag3_get_sck_period;
pgm->parseextparams = jtag3_parseextparms;
pgm->setup = jtag3_setup;
pgm->teardown = jtag3_teardown;
Expand All @@ -3222,6 +3278,8 @@ void jtag3_initpgm(PROGRAMMER *pgm) {
/*
* hardware dependent functions
*/
if (pgm->extra_features & HAS_VTARG_READ)
pgm->get_vtarget = jtag3_get_vtarget;
if (pgm->extra_features & HAS_VTARG_ADJ)
pgm->set_vtarget = jtag3_set_vtarget;
}
Expand Down Expand Up @@ -3261,6 +3319,8 @@ void jtag3_dw_initpgm(PROGRAMMER *pgm) {
/*
* hardware dependent functions
*/
if (pgm->extra_features & HAS_VTARG_READ)
pgm->get_vtarget = jtag3_get_vtarget;
if (pgm->extra_features & HAS_VTARG_ADJ)
pgm->set_vtarget = jtag3_set_vtarget;
}
Expand Down Expand Up @@ -3292,6 +3352,7 @@ void jtag3_pdi_initpgm(PROGRAMMER *pgm) {
pgm->page_erase = jtag3_page_erase;
pgm->print_parms = jtag3_print_parms;
pgm->set_sck_period = jtag3_set_sck_period;
pgm->get_sck_period = jtag3_get_sck_period;
pgm->parseextparams = jtag3_parseextparms;
pgm->setup = jtag3_setup;
pgm->teardown = jtag3_teardown;
Expand All @@ -3302,6 +3363,8 @@ void jtag3_pdi_initpgm(PROGRAMMER *pgm) {
/*
* hardware dependent functions
*/
if (pgm->extra_features & HAS_VTARG_READ)
pgm->get_vtarget = jtag3_get_vtarget;
if (pgm->extra_features & HAS_VTARG_ADJ)
pgm->set_vtarget = jtag3_set_vtarget;
}
Expand Down Expand Up @@ -3333,6 +3396,7 @@ void jtag3_updi_initpgm(PROGRAMMER *pgm) {
pgm->page_erase = jtag3_page_erase;
pgm->print_parms = jtag3_print_parms;
pgm->set_sck_period = jtag3_set_sck_period;
pgm->get_sck_period = jtag3_get_sck_period;
pgm->parseextparams = jtag3_parseextparms;
pgm->setup = jtag3_setup;
pgm->teardown = jtag3_teardown;
Expand All @@ -3345,6 +3409,8 @@ void jtag3_updi_initpgm(PROGRAMMER *pgm) {
/*
* hardware dependent functions
*/
if (pgm->extra_features & HAS_VTARG_READ)
pgm->get_vtarget = jtag3_get_vtarget;
if (pgm->extra_features & HAS_VTARG_ADJ)
pgm->set_vtarget = jtag3_set_vtarget;
}
Expand Down Expand Up @@ -3380,4 +3446,10 @@ void jtag3_tpi_initpgm(PROGRAMMER *pgm) {
pgm->teardown = jtag3_teardown;
pgm->page_size = 256;
pgm->flag = PGM_FL_IS_TPI;

/*
* hardware dependent functions
*/
if (pgm->extra_features & HAS_VTARG_READ)
pgm->get_vtarget = jtag3_get_vtarget;
}
1 change: 1 addition & 0 deletions src/jtag3.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ int jtag3_command(const PROGRAMMER *pgm, unsigned char *cmd, unsigned int cmdlen
void jtag3_display(const PROGRAMMER *pgm, const char *p);
void jtag3_print_parms1(const PROGRAMMER *pgm, const char *p, FILE *fp);
int jtag3_set_vtarget(const PROGRAMMER *pgm, double voltage);
int jtag3_get_vtarget(const PROGRAMMER *pgm, double *voltage);
extern const char jtag3_desc[];
extern const char jtag3_dw_desc[];
extern const char jtag3_pdi_desc[];
Expand Down
20 changes: 20 additions & 0 deletions src/jtagmkII.c
Original file line number Diff line number Diff line change
Expand Up @@ -2424,6 +2424,24 @@ static int jtagmkII_set_sck_period(const PROGRAMMER *pgm, double v) {
return jtagmkII_setparm(pgm, PAR_OCD_JTAG_CLK, &dur);
}

static int jtagmkII_get_sck_period(const PROGRAMMER *pgm, double *v) {
unsigned char buf[4];
double clk;
if (jtagmkII_getparm(pgm, PAR_OCD_JTAG_CLK, buf) < 0) {
pmsg_error("cannot read JTAG clock speed\n");
return -1;
}

if (buf[0] == 0)
clk = 6.4e6;
else if (buf[0] == 1)
clk = 2.8e6;
else
clk = 5.35e6 / buf[0];

*v = 1 / clk;
return 0;
}

/*
* Read an emulator parameter. As the maximal parameter length is 4
Expand Down Expand Up @@ -3614,6 +3632,7 @@ void jtagmkII_initpgm(PROGRAMMER *pgm) {
pgm->page_erase = jtagmkII_page_erase;
pgm->print_parms = jtagmkII_print_parms;
pgm->set_sck_period = jtagmkII_set_sck_period;
pgm->get_sck_period = jtagmkII_get_sck_period;
pgm->parseextparams = jtagmkII_parseextparms;
pgm->setup = jtagmkII_setup;
pgm->teardown = jtagmkII_teardown;
Expand Down Expand Up @@ -3747,6 +3766,7 @@ void jtagmkII_dragon_initpgm(PROGRAMMER *pgm) {
pgm->page_erase = jtagmkII_page_erase;
pgm->print_parms = jtagmkII_print_parms;
pgm->set_sck_period = jtagmkII_set_sck_period;
pgm->get_sck_period = jtagmkII_get_sck_period;
pgm->parseextparams = jtagmkII_parseextparms;
pgm->setup = jtagmkII_setup;
pgm->teardown = jtagmkII_teardown;
Expand Down
58 changes: 16 additions & 42 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -680,50 +680,24 @@ int main(int argc, char * argv [])
}
break;

case 'B': /* specify JTAG ICE bit clock period */
case 'B': /* specify bit clock period */
bitclock = strtod(optarg, &e);
if (*e != 0) {
/* trailing unit of measure present */
int suffixlen = strlen(e);
switch (suffixlen) {
case 2:
if ((e[0] != 'h' && e[0] != 'H') || e[1] != 'z')
bitclock = 0.0;
else
/* convert from Hz to microseconds */
bitclock = 1E6 / bitclock;
break;

case 3:
if ((e[1] != 'h' && e[1] != 'H') || e[2] != 'z')
bitclock = 0.0;
else {
switch (e[0]) {
case 'M':
case 'm': /* no Millihertz here :) */
bitclock = 1.0 / bitclock;
break;

case 'k':
bitclock = 1E3 / bitclock;
break;

default:
bitclock = 0.0;
break;
}
}
break;

default:
bitclock = 0.0;
break;
}
if (bitclock == 0.0)
pmsg_error("invalid bit clock unit of measure '%s'\n", e);
if ((e == optarg) || bitclock <= 0.0) {
pmsg_error("invalid bit clock period %s\n", optarg);
exit(1);
}
if ((e == optarg) || bitclock == 0.0) {
pmsg_error("invalid bit clock period specified '%s'\n", optarg);
while(*e && isascii(*e & 0xff) && isspace(*e & 0xff))
e++;
if(*e == 0 || str_caseeq(e, "us")) // us is optional and the default
;
else if(str_caseeq(e, "m") || str_caseeq(e, "mhz"))
bitclock = 1 / bitclock;
else if(str_caseeq(e, "k") || str_caseeq(e, "khz"))
bitclock = 1e3 / bitclock;
else if(str_caseeq(e, "hz"))
bitclock = 1e6 / bitclock;
else {
pmsg_error("invalid bit clock unit %s\n", e);
exit(1);
}
break;
Expand Down
Loading

0 comments on commit 2bd6b56

Please sign in to comment.