From 6ed529179bbb3f1f6c67ecd478547b7dcbcc36fe Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Tue, 15 Aug 2023 20:23:26 +0100 Subject: [PATCH] Extend terminal config command to two-byte fuses --- src/term.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/term.c b/src/term.c index 72a7fad4..ea0385da 100644 --- a/src/term.c +++ b/src/term.c @@ -958,7 +958,7 @@ typedef union { // Lock memory can be 1 or 4 bytes } fl_t; typedef struct { // Fuses and lock bits - uint8_t fuses[16]; + uint16_t fuses[16]; // pdicfg fuse has two bytes uint32_t lock; int fread[16], lread; int islock; @@ -967,7 +967,7 @@ typedef struct { // Fuses and lock bits typedef struct { const Configitem_t *t; // Configuration bitfield table - const char *memstr; // Could be "lockbits" + const char *memstr; // Memory name but could also be "lockbits" const char *alt; // Set when memstr is an alias int match; // Matched by user request int ok, val, initval; // Has value val been read OK? Initval == -1 if not known @@ -984,7 +984,9 @@ static int getfusel(const PROGRAMMER *pgm, const AVRPART *p, Fusel_t *fl, const int islock; islock = str_starts(cci->memstr, "lock"); - if((islock && cci->t->memoffset != 0) || (!islock && (cci->t->memoffset < 0 || cci->t->memoffset >= (int) sizeof fl->fuses))) { + if((islock && cci->t->memoffset != 0) || + (!islock && (cci->t->memoffset < 0 || cci->t->memoffset >= (int) (sizeof fl->fuses/sizeof*fl->fuses)))) { + err = cache_string(tofree = str_sprintf("%s's %s has invalid memoffset %d", p->desc, cci->memstr, cci->t->memoffset)); free(tofree); goto back; @@ -1009,7 +1011,7 @@ static int getfusel(const PROGRAMMER *pgm, const AVRPART *p, Fusel_t *fl, const goto back; } - if((islock && mem->size != 4 && mem->size != 1) || (!islock && mem->size != 1)) { + if((islock && mem->size != 4 && mem->size != 1) || (!islock && mem->size != 2 && mem->size != 1)) { err = cache_string(tofree = str_sprintf("%s's %s memory has unexpected size %d", p->desc, mem->desc, mem->size)); free(tofree); goto back; @@ -1028,7 +1030,10 @@ static int getfusel(const PROGRAMMER *pgm, const AVRPART *p, Fusel_t *fl, const fl->lread = 1; } else { fl->fread[cci->t->memoffset] = 1; - fl->fuses[cci->t->memoffset] = *m.b; + int result = 0; + for(int i=mem->size-1; i>=0; i--) + result <<= 8, result |= m.b[i]; + fl->fuses[cci->t->memoffset] = result; } fl->islock = islock; fl->current = m.i; @@ -1122,8 +1127,10 @@ static char *valuecomment(const Configitem_t *cti, const Valueitem_t *vp, int va if(!vp && cti->vlist) // No symbolic value despite symbol list? strcpy(buf, "reserved"); // Enter reserved instead of the number - else if (m > 255) // 4-byte lock + else if (m > 65535) // 4-byte lock sprintf(buf, "0x%08x", value); + else if (m > 255) // 2-byte fuse + sprintf(buf, "0x%04x", value); else sprintf(buf, "%*d", o.vmax >= 100? 3: o.vmax >= 10? 2: 1, value); @@ -1533,7 +1540,7 @@ static int cmd_config(const PROGRAMMER *pgm, const AVRPART *p, int argc, char *a goto finished; } - if((fusel.islock && mem->size != 4 && mem->size != 1) || (!fusel.islock && mem->size != 1)) { + if((fusel.islock && mem->size != 4 && mem->size != 1) || (!fusel.islock && mem->size != 2 && mem->size != 1)) { pmsg_error("(config) %s's %s memory has unexpected size %d\n", p->desc, mem->desc, mem->size); ret = -1; goto finished;