Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Terminal mode improvements #1587

Merged
merged 20 commits into from
Dec 18, 2023
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
MCUdude marked this conversation as resolved.
Show resolved Hide resolved
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
22 changes: 22 additions & 0 deletions src/jtagmkII.c
Original file line number Diff line number Diff line change
Expand Up @@ -2424,6 +2424,26 @@ 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 if (buf[0] <= 5)
clk = 5.35e6 / (double)buf[0];
MCUdude marked this conversation as resolved.
Show resolved Hide resolved
else
clk = 5.35e6 / (double)buf[0];
MCUdude marked this conversation as resolved.
Show resolved Hide resolved

*v = 1 / clk;
return 0;
}

/*
* Read an emulator parameter. As the maximal parameter length is 4
Expand Down Expand Up @@ -3614,6 +3634,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 +3768,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
17 changes: 13 additions & 4 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -686,14 +686,23 @@ int main(int argc, char * argv [])
/* trailing unit of measure present */
int suffixlen = strlen(e);
switch (suffixlen) {
case 1:
if (e[0] == 'm' || e[0] == 'M')
bitclock = 1.0 / bitclock;
else if (e[0] == 'k' || e[0] == 'K')
bitclock = 1e3 / bitclock;
else if (e[0] == 'h' || e[0] == 'H')
bitclock = 1e6 / bitclock;
else if (e[0] != 'u')
bitclock = 0.0;
break;
case 2:
if ((e[0] != 'h' && e[0] != 'H') || e[1] != 'z')
if (e[0] == 'u' || e[0] == 'U');
MCUdude marked this conversation as resolved.
Show resolved Hide resolved
else if ((e[0] != 'h' && e[0] != 'H') || e[1] != 'z')
bitclock = 0.0;
else
/* convert from Hz to microseconds */
bitclock = 1E6 / bitclock;
bitclock = 1e6 / bitclock;
break;

case 3:
if ((e[1] != 'h' && e[1] != 'H') || e[2] != 'z')
bitclock = 0.0;
Expand Down
55 changes: 50 additions & 5 deletions src/stk500v2.c
Original file line number Diff line number Diff line change
Expand Up @@ -3237,10 +3237,20 @@ static int stk500v2_set_varef(const PROGRAMMER *pgm, unsigned int chan /* unused
}


static int stk500v2_get_varef(const PROGRAMMER *pgm, unsigned int chan /* unused */,
double *v)
static int stk500v2_get_varef(const PROGRAMMER *pgm, unsigned int chan, double *v)
{
*v = stk500v2_varef_value(pgm);
if(PDATA(pgm)->pgmtype == PGMTYPE_STK500)
*v = stk500v2_varef_value(pgm);
else if(PDATA(pgm)->pgmtype == PGMTYPE_STK600) {
if(chan == 0)
*v = stk600_varef_0_value(pgm);
else if(chan == 1)
*v = stk600_varef_1_value(pgm);
else {
pmsg_error("invalid Varef channel %d specified\n", chan);
return -1;
}
}
return 0;
}

Expand Down Expand Up @@ -3541,6 +3551,21 @@ static int stk500v2_jtag3_set_sck_period(const PROGRAMMER *pgm, double v) {
return 0;
}

static int stk500v2_jtag3_get_sck_period(const PROGRAMMER *pgm, double *v) {
unsigned char cmd[4];
*v = 0;

cmd[0] = CMD_GET_SCK;
if (stk500v2_jtag3_send(pgm, cmd, 1) < 0 || stk500v2_jtag3_recv(pgm, cmd, 4) < 2) {
pmsg_error("cannot read ISP clock speed\n");
return -1;
}

unsigned int sck = cmd[1] | (cmd[2] << 8);
*v = 1 / (1000.0 * sck);
MCUdude marked this conversation as resolved.
Show resolved Hide resolved
return 0;
}

static int stk500v2_getparm(const PROGRAMMER *pgm, unsigned char parm, unsigned char *value) {
unsigned char buf[32];

Expand Down Expand Up @@ -3904,7 +3929,7 @@ static void stk500v2_print_parms1(const PROGRAMMER *pgm, const char *p, FILE *fp
}
fmsg_out(fp, "%sSCK period : %.1f us\n", p, stk500v2_sck_duration_value(pgm));
if (pgm->extra_features & HAS_FOSC_ADJ) {
f = stk500v2_sck_duration_value(pgm);
f = stk500v2_fosc_value(pgm);
f = f_to_kHz_MHz(f, &unit);
fmsg_out(fp, "%sOscillator : %.3f %s\n", p, f, unit);
}
Expand Down Expand Up @@ -5048,6 +5073,7 @@ void stk500v2_jtagmkII_initpgm(PROGRAMMER *pgm) {
pgm->page_erase = NULL;
pgm->print_parms = stk500v2_print_parms;
pgm->set_sck_period = stk500v2_set_sck_period_mk2;
pgm->get_sck_period = stk500v2_get_sck_period;
pgm->perform_osccal = stk500v2_perform_osccal;
pgm->setup = stk500v2_jtagmkII_setup;
pgm->teardown = stk500v2_jtagmkII_teardown;
Expand Down Expand Up @@ -5082,6 +5108,8 @@ void stk500v2_dragon_isp_initpgm(PROGRAMMER *pgm) {
pgm->page_erase = NULL;
pgm->print_parms = stk500v2_print_parms;
pgm->set_sck_period = stk500v2_set_sck_period_mk2;
pgm->get_sck_period = stk500v2_get_sck_period;
pgm->perform_osccal = stk500v2_perform_osccal;
pgm->setup = stk500v2_jtagmkII_setup;
pgm->teardown = stk500v2_jtagmkII_teardown;
pgm->page_size = 256;
Expand Down Expand Up @@ -5113,6 +5141,7 @@ void stk500v2_dragon_pp_initpgm(PROGRAMMER *pgm) {
pgm->paged_load = stk500pp_paged_load;
pgm->print_parms = stk500v2_print_parms;
pgm->set_sck_period = stk500v2_set_sck_period_mk2;
pgm->get_sck_period = stk500v2_get_sck_period;
pgm->setup = stk500v2_jtagmkII_setup;
pgm->teardown = stk500v2_jtagmkII_teardown;
pgm->page_size = 256;
Expand Down Expand Up @@ -5144,6 +5173,7 @@ void stk500v2_dragon_hvsp_initpgm(PROGRAMMER *pgm) {
pgm->paged_load = stk500hvsp_paged_load;
pgm->print_parms = stk500v2_print_parms;
pgm->set_sck_period = stk500v2_set_sck_period_mk2;
pgm->get_sck_period = stk500v2_get_sck_period;
pgm->setup = stk500v2_jtagmkII_setup;
pgm->teardown = stk500v2_jtagmkII_teardown;
pgm->page_size = 256;
Expand Down Expand Up @@ -5177,9 +5207,13 @@ void stk600_initpgm(PROGRAMMER *pgm) {
pgm->page_erase = NULL;
pgm->print_parms = stk500v2_print_parms;
pgm->set_vtarget = stk600_set_vtarget;
pgm->get_vtarget = stk500v2_get_vtarget;
pgm->set_varef = stk600_set_varef;
pgm->get_varef = stk500v2_get_varef;
pgm->set_fosc = stk600_set_fosc;
pgm->get_fosc = stk500v2_get_fosc;
pgm->set_sck_period = stk600_set_sck_period;
pgm->get_sck_period = stk500v2_get_sck_period;
pgm->perform_osccal = stk500v2_perform_osccal;
pgm->parseextparams = stk500v2_parseextparms;
pgm->setup = stk500v2_setup;
Expand Down Expand Up @@ -5213,9 +5247,13 @@ void stk600pp_initpgm(PROGRAMMER *pgm) {
pgm->paged_load = stk500pp_paged_load;
pgm->print_parms = stk500v2_print_parms;
pgm->set_vtarget = stk600_set_vtarget;
pgm->get_vtarget = stk500v2_get_vtarget;
pgm->set_varef = stk600_set_varef;
pgm->get_varef = stk500v2_get_varef;
pgm->set_fosc = stk600_set_fosc;
pgm->get_fosc = stk500v2_get_fosc;
pgm->set_sck_period = stk600_set_sck_period;
pgm->get_sck_period = stk500v2_get_sck_period;
pgm->parseextparams = stk500v2_parseextparms;
pgm->setup = stk500v2_setup;
pgm->teardown = stk500v2_teardown;
Expand Down Expand Up @@ -5248,9 +5286,13 @@ void stk600hvsp_initpgm(PROGRAMMER *pgm) {
pgm->paged_load = stk500hvsp_paged_load;
pgm->print_parms = stk500v2_print_parms;
pgm->set_vtarget = stk600_set_vtarget;
pgm->get_vtarget = stk500v2_get_vtarget;
pgm->set_varef = stk600_set_varef;
pgm->get_varef = stk500v2_get_varef;
pgm->set_fosc = stk600_set_fosc;
pgm->get_fosc = stk500v2_get_fosc;
pgm->set_sck_period = stk600_set_sck_period;
pgm->get_sck_period = stk500v2_get_sck_period;
pgm->parseextparams = stk500v2_parseextparms;
pgm->setup = stk500v2_setup;
pgm->teardown = stk500v2_teardown;
Expand Down Expand Up @@ -5285,6 +5327,7 @@ void stk500v2_jtag3_initpgm(PROGRAMMER *pgm) {
pgm->page_erase = NULL;
pgm->print_parms = stk500v2_print_parms;
pgm->set_sck_period = stk500v2_jtag3_set_sck_period;
pgm->get_sck_period = stk500v2_jtag3_get_sck_period;
pgm->perform_osccal = stk500v2_perform_osccal;
pgm->parseextparams = stk500v2_jtag3_parseextparms;
pgm->setup = stk500v2_jtag3_setup;
Expand All @@ -5295,5 +5338,7 @@ void stk500v2_jtag3_initpgm(PROGRAMMER *pgm) {
* hardware dependent functions
*/
if (pgm->extra_features & HAS_VTARG_ADJ)
pgm->set_vtarget = jtag3_set_vtarget;
pgm->set_vtarget = jtag3_set_vtarget;
if (pgm->extra_features & HAS_VTARG_READ)
pgm->get_vtarget = jtag3_get_vtarget;
}
Loading