@@ -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' ) ;
0 commit comments