@@ -96,9 +96,14 @@ fn read_metadata(
96
96
file_buffer : & [ u8 ] ,
97
97
flash_row_size : u32 ,
98
98
metadata_offset : u32 ,
99
+ ccgx : SiliconId ,
99
100
) -> Option < ( u32 , u32 ) > {
100
101
let buffer = read_256_bytes ( file_buffer, metadata_offset, flash_row_size) ?;
101
- parse_metadata_cyacd ( & buffer)
102
+ match ccgx {
103
+ SiliconId :: Ccg5 | SiliconId :: Ccg6 => parse_metadata_cyacd ( & buffer) ,
104
+ SiliconId :: Ccg8 => parse_metadata_cyacd2 ( & buffer)
105
+ . map ( |( fw_row_start, fw_size) | ( fw_row_start / flash_row_size, fw_size) ) ,
106
+ }
102
107
}
103
108
104
109
/// Read 256 bytes starting from a particular row
@@ -121,8 +126,10 @@ fn read_version(
121
126
file_buffer : & [ u8 ] ,
122
127
flash_row_size : u32 ,
123
128
metadata_offset : u32 ,
129
+ ccgx : SiliconId ,
124
130
) -> Option < PdFirmware > {
125
- let ( fw_row_start, fw_size) = read_metadata ( file_buffer, flash_row_size, metadata_offset) ?;
131
+ let ( fw_row_start, fw_size) =
132
+ read_metadata ( file_buffer, flash_row_size, metadata_offset, ccgx) ?;
126
133
let data = read_256_bytes ( file_buffer, fw_row_start, flash_row_size) ?;
127
134
let data = & data[ FW_VERSION_OFFSET ..] ;
128
135
@@ -152,9 +159,10 @@ pub fn read_versions(file_buffer: &[u8], ccgx: SiliconId) -> Option<PdFirmwareFi
152
159
let ( flash_row_size, f1_metadata_row, fw2_metadata_row) = match ccgx {
153
160
SiliconId :: Ccg5 => ( 0x100 , FW1_METADATA_ROW , FW2_METADATA_ROW_CCG5 ) ,
154
161
SiliconId :: Ccg6 => ( 0x80 , FW1_METADATA_ROW , FW2_METADATA_ROW_CCG6 ) ,
162
+ SiliconId :: Ccg8 => ( 0x100 , FW1_METADATA_ROW_CCG8 , FW2_METADATA_ROW_CCG8 ) ,
155
163
} ;
156
- let backup_fw = read_version ( file_buffer, flash_row_size, f1_metadata_row) ?;
157
- let main_fw = read_version ( file_buffer, flash_row_size, fw2_metadata_row) ?;
164
+ let backup_fw = read_version ( file_buffer, flash_row_size, f1_metadata_row, ccgx ) ?;
165
+ let main_fw = read_version ( file_buffer, flash_row_size, fw2_metadata_row, ccgx ) ?;
158
166
159
167
Some ( PdFirmwareFile { backup_fw, main_fw } )
160
168
}
@@ -190,8 +198,10 @@ mod tests {
190
198
let data = fs:: read ( pd_bin_path) . unwrap ( ) ;
191
199
let ccg5_ver = read_versions ( & data, SiliconId :: Ccg5 ) ;
192
200
let ccg6_ver = read_versions ( & data, SiliconId :: Ccg6 ) ;
201
+ let ccg8_ver = read_versions ( & data, SiliconId :: Ccg8 ) ;
193
202
assert ! ( ccg5_ver. is_some( ) ) ;
194
203
assert ! ( ccg6_ver. is_none( ) ) ;
204
+ assert ! ( ccg8_ver. is_none( ) ) ;
195
205
196
206
assert_eq ! (
197
207
ccg5_ver,
@@ -248,8 +258,10 @@ mod tests {
248
258
let data = fs:: read ( pd_bin_path) . unwrap ( ) ;
249
259
let ccg5_ver = read_versions ( & data, SiliconId :: Ccg5 ) ;
250
260
let ccg6_ver = read_versions ( & data, SiliconId :: Ccg6 ) ;
261
+ let ccg8_ver = read_versions ( & data, SiliconId :: Ccg8 ) ;
251
262
assert ! ( ccg5_ver. is_none( ) ) ;
252
263
assert ! ( ccg6_ver. is_some( ) ) ;
264
+ assert ! ( ccg8_ver. is_none( ) ) ;
253
265
254
266
assert_eq ! (
255
267
ccg6_ver,
@@ -297,4 +309,64 @@ mod tests {
297
309
} )
298
310
) ;
299
311
}
312
+
313
+ #[ test]
314
+ fn can_parse_ccg8_binary ( ) {
315
+ let mut pd_bin_path = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) ;
316
+ pd_bin_path. push ( "test_bins/fl16-pd-0.0.03.bin" ) ;
317
+
318
+ let data = fs:: read ( pd_bin_path) . unwrap ( ) ;
319
+ let ccg5_ver = read_versions ( & data, SiliconId :: Ccg5 ) ;
320
+ let ccg6_ver = read_versions ( & data, SiliconId :: Ccg6 ) ;
321
+ let ccg8_ver = read_versions ( & data, SiliconId :: Ccg8 ) ;
322
+ assert ! ( ccg5_ver. is_none( ) ) ;
323
+ assert ! ( ccg6_ver. is_none( ) ) ;
324
+ assert ! ( ccg8_ver. is_some( ) ) ;
325
+
326
+ assert_eq ! (
327
+ ccg8_ver,
328
+ Some ( {
329
+ PdFirmwareFile {
330
+ backup_fw: PdFirmware {
331
+ silicon_id: 0x11C5 ,
332
+ silicon_family: 0x3580 ,
333
+ base_version: BaseVersion {
334
+ major: 3 ,
335
+ minor: 6 ,
336
+ patch: 0 ,
337
+ build_number: 160 ,
338
+ } ,
339
+ app_version: AppVersion {
340
+ application: Application :: Notebook ,
341
+ major: 0 ,
342
+ minor: 0 ,
343
+ circuit: 3 ,
344
+ } ,
345
+ start_row: 290 ,
346
+ size: 111536 ,
347
+ row_size: 0x100 ,
348
+ } ,
349
+ main_fw: PdFirmware {
350
+ silicon_id: 0x11C5 ,
351
+ silicon_family: 0x3580 ,
352
+ base_version: BaseVersion {
353
+ major: 3 ,
354
+ minor: 6 ,
355
+ patch: 0 ,
356
+ build_number: 160 ,
357
+ } ,
358
+ app_version: AppVersion {
359
+ application: Application :: Notebook ,
360
+ major: 0 ,
361
+ minor: 0 ,
362
+ circuit: 3 ,
363
+ } ,
364
+ start_row: 29 ,
365
+ size: 42312 ,
366
+ row_size: 0x100 ,
367
+ } ,
368
+ }
369
+ } )
370
+ ) ;
371
+ }
300
372
}
0 commit comments