Prepare urclock for autobaud synchronisation

This commit is contained in:
Stefan Rueger 2022-11-16 02:08:13 +00:00
parent d901e0a768
commit 2abb666bd2
No known key found for this signature in database
GPG Key ID: B0B4F1FD86B1EC55
1 changed files with 19 additions and 8 deletions

View File

@ -256,6 +256,8 @@ typedef struct {
bool emulate_ce; // Emulate chip erase when bootloader cannot and user wants it bool emulate_ce; // Emulate chip erase when bootloader cannot and user wants it
bool done_ce; // Set when flash of chip has been erased after first write bool done_ce; // Set when flash of chip has been erased after first write
int sync_silence; // Temporarily set during start of synchronisation
// Info needed about bootloader to patch, if needed, the reset vector and one other vector // Info needed about bootloader to patch, if needed, the reset vector and one other vector
int vblvectornum, // Vector bootloader vector number for jump to application op code int vblvectornum, // Vector bootloader vector number for jump to application op code
vbllevel, // 0=n/a, 1=patch externally, 2=bl patches, 3=bl patches & verifies vbllevel, // 0=n/a, 1=patch externally, 2=bl patches, 3=bl patches & verifies
@ -929,7 +931,7 @@ static void urbootPutVersion(char *buf, uint16_t ver, uint16_t rjmpwp) {
*buf++ = type & UR_PROTECTME? 'p': '-'; *buf++ = type & UR_PROTECTME? 'p': '-';
*buf++ = (hi < 077 && (type & UR_RESETFLAGS)) || hi >= 077? 'r': '-'; *buf++ = (hi < 077 && (type & UR_RESETFLAGS)) || hi >= 077? 'r': '-';
*buf++ = hi >= 077 && (type & UR_AUTOBAUD)? 'a': '-'; // - means no *buf++ = hi >= 077 && (type & UR_AUTOBAUD)? 'a': '-'; // - means no
*buf++ = hi >= 077 && (type & UR_HAS_CE)? 'c': '.'; // . means don't know *buf++ = hi >= 077 && (type & UR_HAS_CE)? 'c': hi >= 077? '-': '.'; // . means don't know
*buf = 0; *buf = 0;
} else if(hi) // Version number in binary from optiboot v4.1 } else if(hi) // Version number in binary from optiboot v4.1
sprintf(buf, "o%d.%d -?s-?-r--", hi, type); sprintf(buf, "o%d.%d -?s-?-r--", hi, type);
@ -1708,6 +1710,7 @@ static int urclock_recv(const PROGRAMMER *pgm, unsigned char *buf, size_t len) {
rv = serial_recv(&pgm->fd, buf, len); rv = serial_recv(&pgm->fd, buf, len);
if(rv < 0) { if(rv < 0) {
if(!ur.sync_silence)
pmsg_warning("programmer is not responding%s\n", ur.uP.name? "": "; try, eg, -xdelay=200"); pmsg_warning("programmer is not responding%s\n", ur.uP.name? "": "; try, eg, -xdelay=200");
return -1; return -1;
} }
@ -1716,8 +1719,7 @@ static int urclock_recv(const PROGRAMMER *pgm, unsigned char *buf, size_t len) {
} }
#define MAX_SYNC_ATTEMPTS 23
#define MAX_SYNC_ATTEMPTS 20
/* /*
* The modified protocol makes stk_insync and stk_ok responses variable but fixed for a single * The modified protocol makes stk_insync and stk_ok responses variable but fixed for a single
@ -1730,7 +1732,13 @@ static int urclock_getsync(const PROGRAMMER *pgm) {
int attempt; int attempt;
// Reduce timeout for establishing comms // Reduce timeout for establishing comms
serial_recv_timeout = 100; // ms serial_recv_timeout = 80; // ms
ur.sync_silence = 1;
iob[0] = Cmnd_STK_GET_SYNC; // Initial sync for autobaud - drain response
iob[1] = Sync_CRC_EOP;
urclock_send(pgm, iob, 2);
serial_drain(&pgm->fd, 0);
for(attempt = 0; attempt < MAX_SYNC_ATTEMPTS; attempt++) { for(attempt = 0; attempt < MAX_SYNC_ATTEMPTS; attempt++) {
iob[0] = Cmnd_STK_GET_SYNC; iob[0] = Cmnd_STK_GET_SYNC;
@ -1746,9 +1754,12 @@ static int urclock_getsync(const PROGRAMMER *pgm) {
} else } else
break; break;
} }
if(attempt > 1) // Don't report first two attempts if(attempt > 2) { // Don't report first three attempts
pmsg_warning("attempt %d of %d: not in sync\n", attempt + 1, MAX_SYNC_ATTEMPTS); ur.sync_silence = 0;
pmsg_warning("attempt %d of %d: not in sync\n", attempt - 2, MAX_SYNC_ATTEMPTS-3);
} }
}
ur.sync_silence = 0;
serial_recv_timeout = 500; // ms serial_recv_timeout = 500; // ms