diff --git a/src/jtagmkI.c b/src/jtagmkI.c index 48d51efb..856ca14a 100644 --- a/src/jtagmkI.c +++ b/src/jtagmkI.c @@ -1085,16 +1085,22 @@ static int jtagmkI_get_sck_period(const PROGRAMMER *pgm, double *v) { *v = 500e3; else if (dur == JTAG_BITRATE_250_kHz) *v = 250e3; - else + else if (dur == JTAG_BITRATE_125_kHz) *v = 125e3; + else { // something went wrong + pmsg_error("wrong JTAG_BITRATE ID %02X\n", dur); + return -1; + } return 0; } static int jtagmkI_get_vtarget(const PROGRAMMER *pgm, double *v) { unsigned char vtarget = 0; - if (jtagmkI_getparm(pgm, PARM_OCD_VTARGET, &vtarget) < 0) - return - 1; + if (jtagmkI_getparm(pgm, PARM_OCD_VTARGET, &vtarget) < 0) { + pmsg_error("jtagmkI_getparm PARM_OCD_VTARGET failed\n"); + return -1; + } *v = 6.25 * (unsigned)vtarget / 255.0; return 0; } diff --git a/src/stk500.c b/src/stk500.c index 673c10f3..aafcccf4 100644 --- a/src/stk500.c +++ b/src/stk500.c @@ -1190,8 +1190,10 @@ static int stk500_set_vtarget(const PROGRAMMER *pgm, double v) { if (uaref > utarg) { pmsg_warning("reducing V[aref] from %.1f to %.1f\n", uaref / 10.0, v); - if ((rc = stk500_setparm(pgm, Parm_STK_VADJUST, utarg)) != 0) + if ((rc = stk500_setparm(pgm, Parm_STK_VADJUST, utarg)) != 0) { + pmsg_error("cannot set V[aref]\n"); return rc; + } } return stk500_setparm(pgm, Parm_STK_VTARGET, utarg); } @@ -1228,7 +1230,10 @@ static int stk500_set_varef(const PROGRAMMER *pgm, unsigned int chan /* unused * "V[target] = %.1f\n", utarg/10.0); return -1; } - return stk500_setparm(pgm, Parm_STK_VADJUST, uaref); + + if ((rc = stk500_setparm(pgm, Parm_STK_VADJUST, uaref)) < 0) + pmsg_error("cannot set V[aref]\n"); + return rc; } @@ -1253,7 +1258,7 @@ static int stk500_set_fosc(const PROGRAMMER *pgm, double v) { 1, 8, 32, 64, 128, 256, 1024 }; size_t idx; - int rc; + int rc = 0; prescale = cmatch = 0; if (v > 0.0) { @@ -1287,31 +1292,39 @@ static int stk500_set_fosc(const PROGRAMMER *pgm, double v) { } } - if ((rc = stk500_setparm(pgm, Parm_STK_OSC_PSCALE, prescale)) != 0 - || (rc = stk500_setparm(pgm, Parm_STK_OSC_CMATCH, cmatch)) != 0) + if ((rc = stk500_setparm(pgm, Parm_STK_OSC_PSCALE, prescale)) != 0 ) { + pmsg_error("cannot set Parm_STK_OSC_PSCALE\n"); return rc; - + } + + if ((rc = stk500_setparm(pgm, Parm_STK_OSC_CMATCH, cmatch)) != 0) { + pmsg_error("cannot set Parm_STK_OSC_CMATCH\n"); + return rc; + } + return 0; } static int stk500_get_fosc(const PROGRAMMER *pgm, double *v) { unsigned prescale=0, cmatch=0; - double fosc = 0; static unsigned ps[] = { 1, 8, 32, 64, 128, 256, 1024 }; int rc; - if ((rc = stk500_getparm(pgm, Parm_STK_OSC_PSCALE, &prescale)) != 0 - || (rc = stk500_getparm(pgm, Parm_STK_OSC_CMATCH, &cmatch)) != 0) + if ((rc = stk500_getparm(pgm, Parm_STK_OSC_PSCALE, &prescale)) != 0) { + pmsg_error("cannot get Parm_STK_OSC_PSCALE\n"); return rc; +} + + if ((rc = stk500_getparm(pgm, Parm_STK_OSC_CMATCH, &cmatch)) != 0) { + pmsg_error("cannot get Parm_STK_OSC_CMATCH\n"); + return rc; + } + + *v = !prescale ? 0 : PDATA(pgm)->xtal / ((cmatch + 1) * 2 * ps[prescale - 1]); - if (prescale) { - fosc = PDATA(pgm)->xtal / ((cmatch + 1) * 2 * ps[prescale - 1]); - } else - fosc = 0; - *v = fosc; return 0; } @@ -1326,11 +1339,12 @@ static int stk500_get_fosc(const PROGRAMMER *pgm, double *v) { static int stk500_set_sck_period(const PROGRAMMER *pgm, double v) { int dur; double min, max; + int rv = 0; min = 8.0 / PDATA(pgm)->xtal; max = 255 * min; dur = v / min + 0.5; - + if (v < min) { dur = 1; pmsg_warning("p = %.1f us too small, using %.1f us\n", @@ -1340,8 +1354,12 @@ static int stk500_set_sck_period(const PROGRAMMER *pgm, double v) { pmsg_warning("p = %.1f us too large, using %.1f us\n", v/1e-6, dur*min/1e-6); } - - return stk500_setparm(pgm, Parm_STK_SCK_DURATION, dur); + + if ((rv = stk500_setparm(pgm, Parm_STK_SCK_DURATION, dur)) < 0) { + pmsg_error("cannot set Parm_STK_SCK_DURATION\n"); + return rv; + } + return 0; } @@ -1349,8 +1367,8 @@ static int stk500_get_sck_period(const PROGRAMMER *pgm, double *v) { unsigned dur; int rv = 0; - if ((rv = stk500_getparm(pgm, Parm_STK_SCK_DURATION, &dur))< 0) { - pmsg_error("cannot obtain sck duration\n"); + if ((rv = stk500_getparm(pgm, Parm_STK_SCK_DURATION, &dur)) < 0) { + pmsg_error("cannot obtain Parm_STK_SCK_DURATION\n"); return rv; } *v = dur * 8.0 / PDATA(pgm)->xtal; diff --git a/src/stk500v2.c b/src/stk500v2.c index 56811024..259e24aa 100644 --- a/src/stk500v2.c +++ b/src/stk500v2.c @@ -301,10 +301,7 @@ void stk500v2_setup(PROGRAMMER * pgm) memset(pgm->cookie, 0, sizeof(struct pdata)); PDATA(pgm)->command_sequence = 1; PDATA(pgm)->boot_start = ULONG_MAX; - if (str_starts(pgmid, "scratchmonkey")) - PDATA(pgm)->xtal = SCRATCHMONKEY_XTAL; - else - PDATA(pgm)->xtal = STK500V2_XTAL; + PDATA(pgm)->xtal = str_starts(pgmid, "scratchmonkey") ? SCRATCHMONKEY_XTAL : STK500V2_XTAL; } static void stk500v2_jtagmkII_setup(PROGRAMMER * pgm) @@ -3719,11 +3716,14 @@ static double stk500v2_vtarget_value(const PROGRAMMER *pgm) { jtagmkII_getparm(pgmcp, PAR_OCD_VTARGET, vtarget_jtag); pgm_free(pgmcp); return b2_to_u16(vtarget_jtag) / 1000.0; - } else if (PDATA(pgm)->pgmtype != PGMTYPE_JTAGICE3) { + } + + if (PDATA(pgm)->pgmtype != PGMTYPE_JTAGICE3) { unsigned char vtarget = 0; stk500v2_getparm(pgm, PARAM_VTARGET, &vtarget); return vtarget / 10.0; } + return 0; } @@ -3736,13 +3736,11 @@ static double stk500v2_sck_duration_value(const PROGRAMMER *pgm) { case PGMTYPE_STK500: stk500v2_getparm(pgm, PARAM_SCK_DURATION, &sck_duration); return stk500v2_sck_to_us(pgm, sck_duration); - break; case PGMTYPE_AVRISP_MKII: case PGMTYPE_JTAGICE_MKII: stk500v2_getparm(pgm, PARAM_SCK_DURATION, &sck_duration); return 1.0e6 / avrispmkIIfreqs[sck_duration]; - break; case PGMTYPE_JTAGICE3: { @@ -3754,16 +3752,13 @@ static double stk500v2_sck_duration_value(const PROGRAMMER *pgm) { } return 0; } - break; case PGMTYPE_STK600: stk500v2_getparm2(pgm, PARAM2_SCK_DURATION, &sck_stk600); return (sck_stk600 + 1) / 8.0; - break; default: return sck_duration * 8.0e6 / PDATA(pgm)->xtal + 0.05; - break; } return 0; } @@ -3771,7 +3766,6 @@ static double stk500v2_sck_duration_value(const PROGRAMMER *pgm) { static double stk500v2_varef_value(const PROGRAMMER *pgm) { unsigned char vadjust = 0; - if (stk500v2_getparm(pgm, PARAM_VADJUST, &vadjust) < 0) return 0; return vadjust / 10.0; @@ -3808,30 +3802,27 @@ static double stk500v2_fosc_value(const PROGRAMMER *pgm) { return 0.0; if (osc_pscale == 0) return 0.0; - else { - prescale = 1; - fosc = PDATA(pgm)->xtal / 2; - switch (osc_pscale) { - case 2: prescale = 8; break; - case 3: prescale = 32; break; - case 4: prescale = 64; break; - case 5: prescale = 128; break; - case 6: prescale = 256; break; - case 7: prescale = 1024; break; - } - fosc /= prescale; - fosc /= (osc_cmatch + 1); - return fosc; + prescale = 1; + fosc = PDATA(pgm)->xtal / 2; + + switch (osc_pscale) { + case 2: prescale = 8; break; + case 3: prescale = 32; break; + case 4: prescale = 64; break; + case 5: prescale = 128; break; + case 6: prescale = 256; break; + case 7: prescale = 1024; break; } - break; + fosc /= prescale; + fosc /= (osc_cmatch + 1); + return fosc; case PGMTYPE_AVRISP_MKII: case PGMTYPE_JTAGICE_MKII: if (stk500v2_getparm(pgm, PARAM_SCK_DURATION, &sck_duration) < 0) return 0.0; return 1e6 / avrispmkIIfreqs[sck_duration]; - break; case PGMTYPE_STK600: if (stk500v2_getparm2(pgm, PARAM2_CLOCK_CONF, &clock_conf) < 0) @@ -3840,14 +3831,10 @@ static double stk500v2_fosc_value(const PROGRAMMER *pgm) { dac = (clock_conf & 0x0ffc) >> 2u; fosc = pow(2, (double)oct) * 2078.0 / (2 - (double)dac / 1024.0); return fosc; - break; default: return 0.0; - break; } - - return 0.0; } @@ -3887,7 +3874,7 @@ static void stk500v2_print_parms1(const PROGRAMMER *pgm, const char *p, FILE *fp case PGMTYPE_AVRISP_MKII: case PGMTYPE_JTAGICE_MKII: - fmsg_out(fp, "%sSCK period : %.2f us\n", p, stk500v2_sck_duration_value(pgm)); + fmsg_out(fp, "%sSCK period : %.1f us\n", p, stk500v2_sck_duration_value(pgm)); break; case PGMTYPE_JTAGICE3: @@ -3896,7 +3883,7 @@ static void stk500v2_print_parms1(const PROGRAMMER *pgm, const char *p, FILE *fp cmd[0] = CMD_GET_SCK; if (stk500v2_jtag3_send(pgm, cmd, 1) >= 0 && stk500v2_jtag3_recv(pgm, cmd, 4) >= 2) { unsigned int sck = cmd[1] | (cmd[2] << 8); - fmsg_out(fp, "%sSCK period : %.2f us\n", p, (1E6 / (1000.0 * sck))); + fmsg_out(fp, "%sSCK period : %.1f us\n", p, (1E6 / (1000.0 * sck))); } PROGRAMMER *pgmcp = pgm_dup(pgm); pgmcp->cookie = PDATA(pgm)->chained_pdata; @@ -3911,10 +3898,10 @@ static void stk500v2_print_parms1(const PROGRAMMER *pgm, const char *p, FILE *fp case PGMTYPE_STK600: if (pgm->extra_features & HAS_VAREF_ADJ) { - fmsg_out(fp, "%sVaref 0 : %.2f V\n", p, stk600_varef_0_value(pgm)); - fmsg_out(fp, "%sVaref 1 : %.2f V\n", p, stk600_varef_1_value(pgm)); + fmsg_out(fp, "%sVaref 0 : %.2f V\n", p, stk600_varef_0_value(pgm)); + fmsg_out(fp, "%sVaref 1 : %.2f V\n", p, stk600_varef_1_value(pgm)); } - fmsg_out(fp, "%sSCK period : %.2f us\n", p, stk500v2_sck_duration_value(pgm)); + 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 = f_to_kHz_MHz(f, &unit); @@ -3923,7 +3910,7 @@ static void stk500v2_print_parms1(const PROGRAMMER *pgm, const char *p, FILE *fp break; default: - fmsg_out(fp, "%sSCK period : %.1f us\n", p, stk500v2_sck_duration_value(pgm)); + fmsg_out(fp, "%sSCK period : %.1f us\n", p, stk500v2_sck_duration_value(pgm)); break; }