Skip to content

Commit 476c675

Browse files
committed
handle switching between slow/fast write, and IMPORTANTLY bodge firmware updater 1v43 so USB runs reliably
1 parent 101074d commit 476c675

File tree

3 files changed

+66
-26
lines changed

3 files changed

+66
-26
lines changed

js/espruino_flasher.js

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -67,17 +67,24 @@ THE SOFTWARE.
6767
var iPoll = setInterval(function() {
6868
console.log("Sending... 0x7F");
6969
Espruino.Serial.write("\x7f", false);
70-
}, 200);
70+
}, 70);
7171
dataReceived = function (c) {
72-
dataReceived = undefined;
7372
console.log("got "+c);
7473
if (c==ACK || c==NACK) {
7574
clearTimeout(iTimeout);
7675
clearInterval(iPoll);
7776
if (!Espruino.Status.hasProgress())
7877
Espruino.Status.setStatus("Initialised.");
79-
console.log("Initialised.");
80-
callback(undefined);
78+
console.log("Initialised. Just waiting for a bit...");
79+
// wait for random extra data...
80+
dataReceived = function(c){
81+
console.log("Already ACKed but got "+c);
82+
};
83+
setTimeout(function() {
84+
dataReceived = undefined;
85+
// finally call callback
86+
bodgeClock(callback);
87+
}, 500);
8188
}
8289
};
8390
};
@@ -120,7 +127,7 @@ THE SOFTWARE.
120127
if (dataCount == count) {
121128
clearTimeout(iTimeout);
122129
dataReceived = undefined;
123-
callback(0,data);
130+
callback(undefined,data);
124131
}
125132
};
126133
};
@@ -148,21 +155,21 @@ THE SOFTWARE.
148155
// send read command
149156
sendCommand(0x11, function(err) {
150157
if (err) {
151-
console.log("Error sending command.");
158+
console.log("Error sending command ("+err+").");
152159
callback(err);
153160
return;
154161
}
155162
// send address
156163
sendData([(addr>>24)&0xFF,(addr>>16)&0xFF,(addr>>8)&0xFF,addr&0xFF], function(err) {
157164
if (err) {
158-
console.log("Error sending address.");
165+
console.log("Error sending address. ("+err+")");
159166
callback(err);
160167
return;
161168
}
162169
// send amount of bytes we want
163170
sendData([readBytes-1], function(err) {
164171
if (err) {
165-
console.log("Error while reading.");
172+
console.log("Error while reading. ("+err+")");
166173
callback(err);
167174
return;
168175
}
@@ -182,13 +189,34 @@ THE SOFTWARE.
182189
});
183190
};
184191

192+
var bodgeClock = function(callback) {
193+
/* 1v43 bootloader ran APB1 at 9Mhz, which isn't enough for
194+
some STM32 silicon, which has a bug. Instead, set the APB1 clock
195+
using the bootloader write command, which will fix it up enough for
196+
flashing. */
197+
var RCC_CFGR = 0x40021004;
198+
readData(function(err, data) {
199+
if (err) return callback(err);
200+
var word = (data[3]<<24) | (data[2]<<16) | (data[1]<<8) | data[0];
201+
console.log("RCC->CFGR = "+word);
202+
var newword = (word&0xFFFFF8FF) | 0x00000400;
203+
if (newword==word) {
204+
console.log("RCC->CFGR is correct");
205+
callback(undefined);
206+
} else {
207+
console.log("Setting RCC->CFGR to "+newword);
208+
writeData(callback, RCC_CFGR, [newword&0xFF, (newword>>8)&0xFF, (newword>>16)&0xFF, (newword>>24)&0xFF]);
209+
}
210+
}, RCC_CFGR, 4);
211+
}
212+
185213
var writeData = function(callback, addr, data) {
186214
if (data.length>256) callback("Writing too much data");
187215
console.log("Writing "+data.length+" bytes at 0x"+addr.toString(16)+"...");
188216
// send write command
189217
sendCommand(0x31, function(err) {
190218
if (err) {
191-
console.log("Error sending command. retrying...");
219+
console.log("Error sending command ("+err+"). retrying...");
192220
initialiseChip(function (err) {
193221
if (err) callback(err);
194222
else writeData(callback, addr, data);
@@ -198,7 +226,7 @@ THE SOFTWARE.
198226
// send address
199227
sendData([(addr>>24)&0xFF,(addr>>16)&0xFF,(addr>>8)&0xFF,addr&0xFF], function(err) {
200228
if (err) {
201-
console.log("Error sending address. retrying...");
229+
console.log("Error sending address ("+err+"). retrying...");
202230
initialiseChip(function (err) {
203231
if (err) callback(err);
204232
else writeData(callback, addr, data);
@@ -211,7 +239,7 @@ THE SOFTWARE.
211239
// send data
212240
sendData(sData, function(err) {
213241
if (err) {
214-
console.log("Error while writing. retrying...");
242+
console.log("Error while writing ("+err+"). retrying...");
215243
initialiseChip(function (err) {
216244
if (err) callback(err);
217245
else writeData(callback, addr, data);
@@ -290,19 +318,25 @@ THE SOFTWARE.
290318
bytesReceived = [];
291319
}
292320
});
321+
var hadSlowWrite = Espruino.Serial.isSlowWrite();
322+
Espruino.Serial.setSlowWrite(false);
323+
var finish = function(err) {
324+
Espruino.Serial.setSlowWrite(hadSlowWrite);
325+
callback(err);
326+
};
293327
// initialise
294328
initialiseChip(function (err) {
295-
if (err) { callback(err); return; }
329+
if (err) { finish(err); return; }
296330
eraseChip(function (err) {
297-
if (err) { callback(err); return; }
331+
if (err) { finish(err); return; }
298332
writeAllData(binary, function (err) {
299-
if (err) { callback(err); return; }
300-
callback();
333+
if (err) { finish(err); return; }
334+
finish();
301335
});
302336
});
303337
/*readAllData(binary.byteLength, function(err,chipData) {
304338
if (err) {
305-
callback(err);
339+
finish(err);
306340
return;
307341
}
308342
var errors = 0;
@@ -329,6 +363,10 @@ THE SOFTWARE.
329363
console.log("FIRMWARE: Current "+Espruino.Process.Env.VERSION+", Available "+boardInfo.info.binary_version);
330364
var vCurrent = Espruino.General.versionToFloat(Espruino.Process.Env.VERSION);
331365
var vAvailable = Espruino.General.versionToFloat(boardInfo.info.binary_version);
366+
if (vCurrent > 1.43) {
367+
console.log("Firmware >1.43 supports faster writes");
368+
Espruino.Serial.setSlowWrite(false);
369+
}
332370
if (vAvailable > vCurrent) {
333371
console.log("New Firmware "+boardInfo.info.binary_version+" available");
334372
Espruino.Status.setStatus("New Firmware "+boardInfo.info.binary_version+' available. Click <div style="display: inline-block" class="ui-state-default"><span class="ui-icon ui-icon-info"></span></div> to update');

js/espruino_serial.js

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ Author: Gordon Williams (gw@pur3.co.uk)
2626
var connectionDisconnectCallback;
2727

2828
// For throttled write
29+
var slowWrite = true;
2930
var writeData = undefined;
3031
var writeInterval = undefined;
3132

@@ -94,19 +95,14 @@ Author: Gordon Williams (gw@pur3.co.uk)
9495
if (!isConnected()) return; // throw data away
9596
if (showStatus===undefined) showStatus=true;
9697

97-
/*var d = [];
98-
for (var i=0;i<data.length;i++) d.push(data.charCodeAt(i));
99-
console.log("Write "+data.length+" bytes - "+JSON.stringify(d));*/
100-
101-
/* Here we queue data up to write out. We do this slowly because somehow
102-
characters get lost otherwise (compared to if we used other terminal apps
103-
like minicom) */
98+
/* Here we queue data up to write out. We do this slowly because on older
99+
versions of Espruino, sometimes characters get lost if we send too quickly. */
104100
if (writeData == undefined)
105101
writeData = data;
106102
else
107103
writeData += data;
108104

109-
var blockSize = 50;
105+
var blockSize = slowWrite ? 30 : 1024;
110106

111107
showStatus &= writeData.length>blockSize;
112108
if (showStatus) {
@@ -139,7 +135,7 @@ Author: Gordon Williams (gw@pur3.co.uk)
139135
sender(); // send data instantly
140136
// if there was any more left, do it after a delay
141137
if (writeData!=undefined) {
142-
writeInterval = setInterval(sender, 100);
138+
writeInterval = setInterval(sender, 60);
143139
} else {
144140
if (showStatus)
145141
Espruino.Status.setStatus("Sent");
@@ -163,6 +159,11 @@ Author: Gordon Williams (gw@pur3.co.uk)
163159
"isConnected": isConnected,
164160
"startListening": startListening,
165161
"write": writeSerial,
166-
"close": closeSerial
162+
"close": closeSerial,
163+
"isSlowWrite": function() { return slowWrite; },
164+
"setSlowWrite": function(isOn) {
165+
console.log("Set Slow Write = "+isOn);
166+
slowWrite = isOn;
167+
}
167168
};
168169
})();

js/terminal.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ Author: Gordon Williams (gw@pur3.co.uk)
243243
return;
244244
}
245245
Espruino.Status.setStatus("Connecting");
246+
Espruino.Serial.setSlowWrite(true);
246247
setConnectedState(false);
247248
Espruino.Serial.open(serialPort, function(cInfo) {
248249
if (cInfo!=undefined) {

0 commit comments

Comments
 (0)