1
+ use std:: { borrow:: Cow , thread:: sleep} ;
2
+
1
3
use bytemuck:: { __core:: time:: Duration , bytes_of, Pod , Zeroable } ;
2
4
use serial:: { BaudRate , SystemPort } ;
3
5
use strum_macros:: Display ;
4
6
5
- use std:: thread:: sleep;
6
-
7
- use crate :: elf:: RomSegment ;
8
- use crate :: error:: { ConnectionError , ElfError , FlashDetectError , ResultExt , RomError } ;
9
7
use crate :: {
10
- chip:: Chip , connection:: Connection , elf:: FirmwareImage , encoder:: SlipEncoder ,
11
- error:: RomErrorKind , Error , PartitionTable ,
8
+ chip:: Chip ,
9
+ connection:: Connection ,
10
+ elf:: { FirmwareImage , RomSegment } ,
11
+ encoder:: SlipEncoder ,
12
+ error:: { ConnectionError , ElfError , FlashDetectError , ResultExt , RomError , RomErrorKind } ,
13
+ Error , PartitionTable ,
12
14
} ;
13
- use std:: borrow:: Cow ;
14
15
15
16
pub ( crate ) type Encoder < ' a > = SlipEncoder < ' a , SystemPort > ;
16
17
@@ -187,15 +188,6 @@ struct BeginParams {
187
188
encrypted : u32 ,
188
189
}
189
190
190
- #[ derive( Zeroable , Pod , Copy , Clone , Debug ) ]
191
- #[ repr( C ) ]
192
- struct WriteRegParams {
193
- addr : u32 ,
194
- value : u32 ,
195
- mask : u32 ,
196
- delay_us : u32 ,
197
- }
198
-
199
191
#[ derive( Zeroable , Pod , Copy , Clone ) ]
200
192
#[ repr( C ) ]
201
193
struct EntryParams {
@@ -255,7 +247,7 @@ impl Flasher {
255
247
}
256
248
257
249
fn chip_detect ( & mut self ) -> Result < ( ) , Error > {
258
- let magic = self . read_reg ( CHIP_DETECT_MAGIC_REG_ADDR ) ?;
250
+ let magic = self . connection . read_reg ( CHIP_DETECT_MAGIC_REG_ADDR ) ?;
259
251
let chip = Chip :: from_magic ( magic) ?;
260
252
261
253
self . chip = chip;
@@ -375,8 +367,8 @@ impl Flasher {
375
367
376
368
let spi_registers = self . chip . spi_registers ( ) ;
377
369
378
- let old_spi_usr = self . read_reg ( spi_registers. usr ( ) ) ?;
379
- let old_spi_usr2 = self . read_reg ( spi_registers. usr2 ( ) ) ?;
370
+ let old_spi_usr = self . connection . read_reg ( spi_registers. usr ( ) ) ?;
371
+ let old_spi_usr2 = self . connection . read_reg ( spi_registers. usr2 ( ) ) ?;
380
372
381
373
let mut flags = 1 << 31 ;
382
374
if !data. is_empty ( ) {
@@ -386,17 +378,21 @@ impl Flasher {
386
378
flags |= 1 << 28 ;
387
379
}
388
380
389
- self . write_reg ( spi_registers. usr ( ) , flags, None ) ?;
390
- self . write_reg ( spi_registers. usr2 ( ) , 7 << 28 | command as u32 , None ) ?;
381
+ self . connection
382
+ . write_reg ( spi_registers. usr ( ) , flags, None ) ?;
383
+ self . connection
384
+ . write_reg ( spi_registers. usr2 ( ) , 7 << 28 | command as u32 , None ) ?;
391
385
392
386
if let ( Some ( mosi_data_length) , Some ( miso_data_length) ) =
393
387
( spi_registers. mosi_length ( ) , spi_registers. miso_length ( ) )
394
388
{
395
389
if !data. is_empty ( ) {
396
- self . write_reg ( mosi_data_length, data. len ( ) as u32 * 8 - 1 , None ) ?;
390
+ self . connection
391
+ . write_reg ( mosi_data_length, data. len ( ) as u32 * 8 - 1 , None ) ?;
397
392
}
398
393
if read_bits > 0 {
399
- self . write_reg ( miso_data_length, read_bits - 1 , None ) ?;
394
+ self . connection
395
+ . write_reg ( miso_data_length, read_bits - 1 , None ) ?;
400
396
}
401
397
} else {
402
398
let mosi_mask = if data. is_empty ( ) {
@@ -405,26 +401,32 @@ impl Flasher {
405
401
data. len ( ) as u32 * 8 - 1
406
402
} ;
407
403
let miso_mask = if read_bits == 0 { 0 } else { read_bits - 1 } ;
408
- self . write_reg ( spi_registers. usr1 ( ) , miso_mask << 8 | mosi_mask << 17 , None ) ?;
404
+ self . connection . write_reg (
405
+ spi_registers. usr1 ( ) ,
406
+ miso_mask << 8 | mosi_mask << 17 ,
407
+ None ,
408
+ ) ?;
409
409
}
410
410
411
411
if data. is_empty ( ) {
412
- self . write_reg ( spi_registers. w0 ( ) , 0 , None ) ?;
412
+ self . connection . write_reg ( spi_registers. w0 ( ) , 0 , None ) ?;
413
413
} else {
414
414
for ( i, bytes) in data. chunks ( 4 ) . enumerate ( ) {
415
415
let mut data_bytes = [ 0 ; 4 ] ;
416
416
data_bytes[ 0 ..bytes. len ( ) ] . copy_from_slice ( bytes) ;
417
417
let data = u32:: from_le_bytes ( data_bytes) ;
418
- self . write_reg ( spi_registers. w0 ( ) + i as u32 , data, None ) ?;
418
+ self . connection
419
+ . write_reg ( spi_registers. w0 ( ) + i as u32 , data, None ) ?;
419
420
}
420
421
}
421
422
422
- self . write_reg ( spi_registers. cmd ( ) , 1 << 18 , None ) ?;
423
+ self . connection
424
+ . write_reg ( spi_registers. cmd ( ) , 1 << 18 , None ) ?;
423
425
424
426
let mut i = 0 ;
425
427
loop {
426
428
sleep ( Duration :: from_millis ( 1 ) ) ;
427
- if self . read_reg ( spi_registers. usr ( ) ) ? & ( 1 << 18 ) == 0 {
429
+ if self . connection . read_reg ( spi_registers. usr ( ) ) ? & ( 1 << 18 ) == 0 {
428
430
break ;
429
431
}
430
432
i += 1 ;
@@ -433,32 +435,13 @@ impl Flasher {
433
435
}
434
436
}
435
437
436
- let result = self . read_reg ( spi_registers. w0 ( ) ) ?;
437
- self . write_reg ( spi_registers. usr ( ) , old_spi_usr, None ) ?;
438
- self . write_reg ( spi_registers. usr2 ( ) , old_spi_usr2, None ) ?;
439
-
440
- Ok ( result)
441
- }
442
-
443
- fn read_reg ( & mut self , reg : u32 ) -> Result < u32 , Error > {
438
+ let result = self . connection . read_reg ( spi_registers. w0 ( ) ) ?;
444
439
self . connection
445
- . with_timeout ( Command :: ReadReg . timeout ( ) , |connection| {
446
- connection. command ( Command :: ReadReg , & reg. to_le_bytes ( ) [ ..] , 0 )
447
- } )
448
- }
449
-
450
- fn write_reg ( & mut self , addr : u32 , value : u32 , mask : Option < u32 > ) -> Result < ( ) , Error > {
451
- let params = WriteRegParams {
452
- addr,
453
- value,
454
- mask : mask. unwrap_or ( 0xFFFFFFFF ) ,
455
- delay_us : 0 ,
456
- } ;
440
+ . write_reg ( spi_registers. usr ( ) , old_spi_usr, None ) ?;
457
441
self . connection
458
- . with_timeout ( Command :: WriteReg . timeout ( ) , |connection| {
459
- connection. command ( Command :: WriteReg , bytes_of ( & params) , 0 )
460
- } ) ?;
461
- Ok ( ( ) )
442
+ . write_reg ( spi_registers. usr2 ( ) , old_spi_usr2, None ) ?;
443
+
444
+ Ok ( result)
462
445
}
463
446
464
447
/// The chip type that the flasher is connected to
0 commit comments