@@ -19,7 +19,7 @@ use userlib::{hl, task_slot, RecvMessage, UnwrapLite};
19
19
#[ cfg( feature = "h753" ) ]
20
20
use stm32h7:: stm32h753 as device;
21
21
22
- use drv_stm32h7_qspi:: Qspi ;
22
+ use drv_stm32h7_qspi:: { Qspi , QspiError } ;
23
23
use drv_stm32xx_sys_api as sys_api;
24
24
25
25
task_slot ! ( SYS , sys) ;
@@ -34,7 +34,7 @@ struct SlotReader<'a> {
34
34
}
35
35
36
36
impl < ' a > TlvcRead for SlotReader < ' a > {
37
- type Error = core :: convert :: Infallible ;
37
+ type Error = AuxFlashError ;
38
38
39
39
fn extent ( & self ) -> Result < u64 , TlvcReadError < Self :: Error > > {
40
40
// Hard-coded slot size, on a per-board basis
@@ -46,13 +46,23 @@ impl<'a> TlvcRead for SlotReader<'a> {
46
46
dest : & mut [ u8 ] ,
47
47
) -> Result < ( ) , TlvcReadError < Self :: Error > > {
48
48
let addr: u32 = self . base + u32:: try_from ( offset) . unwrap_lite ( ) ;
49
- self . qspi . read_memory ( addr, dest) ;
49
+ self . qspi
50
+ . read_memory ( addr, dest)
51
+ . map_err ( |x| TlvcReadError :: User ( qspi_to_auxflash ( x) ) ) ?;
50
52
Ok ( ( ) )
51
53
}
52
54
}
53
55
54
56
////////////////////////////////////////////////////////////////////////////////
55
57
58
+ // There isn't a great crate to do `From` implementation so do this manually
59
+ fn qspi_to_auxflash ( val : QspiError ) -> AuxFlashError {
60
+ match val {
61
+ QspiError :: Timeout => AuxFlashError :: QspiTimeout ,
62
+ QspiError :: TransferError => AuxFlashError :: QspiTransferError ,
63
+ }
64
+ }
65
+
56
66
#[ export_name = "main" ]
57
67
fn main ( ) -> ! {
58
68
let sys = sys_api:: Sys :: from ( SYS . get_task_id ( ) ) ;
@@ -133,9 +143,12 @@ impl ServerImpl {
133
143
///
134
144
/// Sleep times are in ticks (typically milliseconds) and are somewhat
135
145
/// experimentally determined, see hubris#753 for details.
136
- fn poll_for_write_complete ( & self , sleep : Option < u64 > ) {
146
+ fn poll_for_write_complete (
147
+ & self ,
148
+ sleep : Option < u64 > ,
149
+ ) -> Result < ( ) , AuxFlashError > {
137
150
loop {
138
- let status = self . qspi . read_status ( ) ;
151
+ let status = self . qspi . read_status ( ) . map_err ( qspi_to_auxflash ) ? ;
139
152
if status & 1 == 0 {
140
153
// ooh we're done
141
154
break ;
@@ -144,11 +157,12 @@ impl ServerImpl {
144
157
hl:: sleep_for ( sleep) ;
145
158
}
146
159
}
160
+ Ok ( ( ) )
147
161
}
148
162
149
163
fn set_and_check_write_enable ( & self ) -> Result < ( ) , AuxFlashError > {
150
- self . qspi . write_enable ( ) ;
151
- let status = self . qspi . read_status ( ) ;
164
+ self . qspi . write_enable ( ) . map_err ( qspi_to_auxflash ) ? ;
165
+ let status = self . qspi . read_status ( ) . map_err ( qspi_to_auxflash ) ? ;
152
166
153
167
if status & 0b10 == 0 {
154
168
// oh oh
@@ -197,20 +211,26 @@ impl ServerImpl {
197
211
let amount = ( read_end - read_addr) . min ( buf. len ( ) ) ;
198
212
199
213
// Read from the active slot
200
- self . qspi . read_memory ( read_addr as u32 , & mut buf[ ..amount] ) ;
214
+ self . qspi
215
+ . read_memory ( read_addr as u32 , & mut buf[ ..amount] )
216
+ . map_err ( qspi_to_auxflash) ?;
201
217
202
218
// If we're at the start of a sector, erase it before we start
203
219
// writing the copy.
204
220
if write_addr % SECTOR_SIZE_BYTES == 0 {
205
221
self . set_and_check_write_enable ( ) ?;
206
- self . qspi . sector_erase ( write_addr as u32 ) ;
207
- self . poll_for_write_complete ( Some ( 1 ) ) ;
222
+ self . qspi
223
+ . sector_erase ( write_addr as u32 )
224
+ . map_err ( qspi_to_auxflash) ?;
225
+ self . poll_for_write_complete ( Some ( 1 ) ) ?;
208
226
}
209
227
210
228
// Write back to the redundant slot
211
229
self . set_and_check_write_enable ( ) ?;
212
- self . qspi . page_program ( write_addr as u32 , & buf[ ..amount] ) ;
213
- self . poll_for_write_complete ( None ) ;
230
+ self . qspi
231
+ . page_program ( write_addr as u32 , & buf[ ..amount] )
232
+ . map_err ( qspi_to_auxflash) ?;
233
+ self . poll_for_write_complete ( None ) ?;
214
234
215
235
read_addr += amount;
216
236
write_addr += amount;
@@ -232,15 +252,15 @@ impl idl::InOrderAuxFlashImpl for ServerImpl {
232
252
_: & RecvMessage ,
233
253
) -> Result < AuxFlashId , RequestError < AuxFlashError > > {
234
254
let mut idbuf = [ 0 ; 20 ] ;
235
- self . qspi . read_id ( & mut idbuf) ;
255
+ self . qspi . read_id ( & mut idbuf) . map_err ( qspi_to_auxflash ) ? ;
236
256
Ok ( AuxFlashId ( idbuf) )
237
257
}
238
258
239
259
fn read_status (
240
260
& mut self ,
241
261
_: & RecvMessage ,
242
262
) -> Result < u8 , RequestError < AuxFlashError > > {
243
- Ok ( self . qspi . read_status ( ) )
263
+ Ok ( self . qspi . read_status ( ) . map_err ( qspi_to_auxflash ) ? )
244
264
}
245
265
246
266
fn slot_count (
@@ -282,9 +302,11 @@ impl idl::InOrderAuxFlashImpl for ServerImpl {
282
302
let mut addr = mem_start;
283
303
while addr < mem_end {
284
304
self . set_and_check_write_enable ( ) ?;
285
- self . qspi . sector_erase ( addr as u32 ) ;
305
+ self . qspi
306
+ . sector_erase ( addr as u32 )
307
+ . map_err ( qspi_to_auxflash) ?;
286
308
addr += SECTOR_SIZE_BYTES ;
287
- self . poll_for_write_complete ( Some ( 1 ) ) ;
309
+ self . poll_for_write_complete ( Some ( 1 ) ) ? ;
288
310
}
289
311
Ok ( ( ) )
290
312
}
@@ -307,8 +329,10 @@ impl idl::InOrderAuxFlashImpl for ServerImpl {
307
329
}
308
330
309
331
self . set_and_check_write_enable ( ) ?;
310
- self . qspi . sector_erase ( addr as u32 ) ;
311
- self . poll_for_write_complete ( Some ( 1 ) ) ;
332
+ self . qspi
333
+ . sector_erase ( addr as u32 )
334
+ . map_err ( qspi_to_auxflash) ?;
335
+ self . poll_for_write_complete ( Some ( 1 ) ) ?;
312
336
Ok ( ( ) )
313
337
}
314
338
@@ -343,8 +367,10 @@ impl idl::InOrderAuxFlashImpl for ServerImpl {
343
367
. map_err ( |_| RequestError :: Fail ( ClientError :: WentAway ) ) ?;
344
368
345
369
self . set_and_check_write_enable ( ) ?;
346
- self . qspi . page_program ( addr as u32 , & buf[ ..amount] ) ;
347
- self . poll_for_write_complete ( None ) ;
370
+ self . qspi
371
+ . page_program ( addr as u32 , & buf[ ..amount] )
372
+ . map_err ( qspi_to_auxflash) ?;
373
+ self . poll_for_write_complete ( None ) ?;
348
374
addr += amount;
349
375
read += amount;
350
376
}
@@ -369,7 +395,9 @@ impl idl::InOrderAuxFlashImpl for ServerImpl {
369
395
let mut buf = [ 0u8 ; 256 ] ;
370
396
while addr < end {
371
397
let amount = ( end - addr) . min ( buf. len ( ) ) ;
372
- self . qspi . read_memory ( addr as u32 , & mut buf[ ..amount] ) ;
398
+ self . qspi
399
+ . read_memory ( addr as u32 , & mut buf[ ..amount] )
400
+ . map_err ( qspi_to_auxflash) ?;
373
401
dest. write_range ( write..( write + amount) , & buf[ ..amount] )
374
402
. map_err ( |_| RequestError :: Fail ( ClientError :: WentAway ) ) ?;
375
403
write += amount;
0 commit comments