@@ -110,7 +110,7 @@ fn read_metadata(
110110 match ccgx {
111111 SiliconId :: Ccg3 => parse_metadata_ccg3 ( & buffer) ,
112112 SiliconId :: Ccg5 | SiliconId :: Ccg6Adl | SiliconId :: Ccg6 => parse_metadata_cyacd ( & buffer) ,
113- SiliconId :: Ccg8 => parse_metadata_cyacd2 ( & buffer)
113+ SiliconId :: Ccg8D | SiliconId :: Ccg8S | SiliconId :: Ccg8Cfp => parse_metadata_cyacd2 ( & buffer)
114114 . map ( |( fw_row_start, fw_size) | ( fw_row_start / ( flash_row_size as u32 ) , fw_size) ) ,
115115 }
116116}
@@ -172,10 +172,12 @@ fn read_version(
172172pub fn read_versions ( file_buffer : & [ u8 ] , ccgx : SiliconId ) -> Option < PdFirmwareFile > {
173173 let ( flash_row_size, f1_metadata_row, fw2_metadata_row) = match ccgx {
174174 SiliconId :: Ccg3 => ( SMALL_ROW , 0x03FF , 0x03FE ) ,
175- SiliconId :: Ccg5 => ( LARGE_ROW , FW1_METADATA_ROW , FW2_METADATA_ROW_CCG5 ) ,
176- SiliconId :: Ccg6Adl => ( SMALL_ROW , FW1_METADATA_ROW , FW2_METADATA_ROW_CCG6 ) ,
177- SiliconId :: Ccg6 => ( SMALL_ROW , FW1_METADATA_ROW , FW2_METADATA_ROW_CCG6 ) ,
178- SiliconId :: Ccg8 => ( LARGE_ROW , FW1_METADATA_ROW_CCG8 , FW2_METADATA_ROW_CCG8 ) ,
175+ SiliconId :: Ccg5 => ( LARGE_ROW , 0x1FE , 0x1FF ) ,
176+ SiliconId :: Ccg6Adl => ( SMALL_ROW , 0x1FE , 0x1FD ) ,
177+ SiliconId :: Ccg6 => ( SMALL_ROW , 0x1FE , 0x1FD ) ,
178+ SiliconId :: Ccg8D => ( LARGE_ROW , 0x3FE , 0x3FF ) ,
179+ SiliconId :: Ccg8S => ( LARGE_ROW , 0x3FE , 0x3FF ) ,
180+ SiliconId :: Ccg8Cfp => ( LARGE_ROW , 0x1FE , 0x1FF ) ,
179181 } ;
180182 let backup_fw = read_version ( file_buffer, flash_row_size, f1_metadata_row, ccgx) ?;
181183 let main_fw = read_version ( file_buffer, flash_row_size, fw2_metadata_row, ccgx) ?;
@@ -215,11 +217,15 @@ mod tests {
215217 let ccg3_ver = read_versions ( & data, SiliconId :: Ccg3 ) ;
216218 let ccg5_ver = read_versions ( & data, SiliconId :: Ccg5 ) ;
217219 let ccg6_ver = read_versions ( & data, SiliconId :: Ccg6 ) ;
218- let ccg8_ver = read_versions ( & data, SiliconId :: Ccg8 ) ;
220+ let ccg8d_ver = read_versions ( & data, SiliconId :: Ccg8D ) ;
221+ let ccg8s_ver = read_versions ( & data, SiliconId :: Ccg8S ) ;
222+ let ccg8cfp_ver = read_versions ( & data, SiliconId :: Ccg8Cfp ) ;
219223 assert ! ( ccg3_ver. is_some( ) ) ;
220224 assert ! ( ccg5_ver. is_none( ) ) ;
221225 assert ! ( ccg6_ver. is_none( ) ) ;
222- assert ! ( ccg8_ver. is_none( ) ) ;
226+ assert ! ( ccg8d_ver. is_none( ) ) ;
227+ assert ! ( ccg8s_ver. is_none( ) ) ;
228+ assert ! ( ccg8cfp_ver. is_none( ) ) ;
223229
224230 assert_eq ! (
225231 ccg3_ver,
@@ -277,11 +283,15 @@ mod tests {
277283 let ccg3_ver = read_versions ( & data, SiliconId :: Ccg3 ) ;
278284 let ccg5_ver = read_versions ( & data, SiliconId :: Ccg5 ) ;
279285 let ccg6_ver = read_versions ( & data, SiliconId :: Ccg6 ) ;
280- let ccg8_ver = read_versions ( & data, SiliconId :: Ccg8 ) ;
286+ let ccg8d_ver = read_versions ( & data, SiliconId :: Ccg8D ) ;
287+ let ccg8s_ver = read_versions ( & data, SiliconId :: Ccg8S ) ;
288+ let ccg8cfp_ver = read_versions ( & data, SiliconId :: Ccg8Cfp ) ;
281289 assert ! ( ccg3_ver. is_none( ) ) ;
282290 assert ! ( ccg5_ver. is_some( ) ) ;
283291 assert ! ( ccg6_ver. is_none( ) ) ;
284- assert ! ( ccg8_ver. is_none( ) ) ;
292+ assert ! ( ccg8d_ver. is_none( ) ) ;
293+ assert ! ( ccg8s_ver. is_none( ) ) ;
294+ assert ! ( ccg8cfp_ver. is_none( ) ) ;
285295
286296 assert_eq ! (
287297 ccg5_ver,
@@ -339,11 +349,15 @@ mod tests {
339349 let ccg3_ver = read_versions ( & data, SiliconId :: Ccg3 ) ;
340350 let ccg5_ver = read_versions ( & data, SiliconId :: Ccg5 ) ;
341351 let ccg6_ver = read_versions ( & data, SiliconId :: Ccg6 ) ;
342- let ccg8_ver = read_versions ( & data, SiliconId :: Ccg8 ) ;
352+ let ccg8d_ver = read_versions ( & data, SiliconId :: Ccg8D ) ;
353+ let ccg8s_ver = read_versions ( & data, SiliconId :: Ccg8S ) ;
354+ let ccg8cfp_ver = read_versions ( & data, SiliconId :: Ccg8Cfp ) ;
343355 assert ! ( ccg3_ver. is_none( ) ) ;
344356 assert ! ( ccg5_ver. is_none( ) ) ;
345357 assert ! ( ccg6_ver. is_some( ) ) ;
346- assert ! ( ccg8_ver. is_none( ) ) ;
358+ assert ! ( ccg8d_ver. is_none( ) ) ;
359+ assert ! ( ccg8s_ver. is_none( ) ) ;
360+ assert ! ( ccg8cfp_ver. is_none( ) ) ;
347361
348362 assert_eq ! (
349363 ccg6_ver,
@@ -401,11 +415,15 @@ mod tests {
401415 let ccg3_ver = read_versions ( & data, SiliconId :: Ccg3 ) ;
402416 let ccg5_ver = read_versions ( & data, SiliconId :: Ccg5 ) ;
403417 let ccg6_ver = read_versions ( & data, SiliconId :: Ccg6 ) ;
404- let ccg8_ver = read_versions ( & data, SiliconId :: Ccg8 ) ;
418+ let ccg8d_ver = read_versions ( & data, SiliconId :: Ccg8D ) ;
419+ let ccg8s_ver = read_versions ( & data, SiliconId :: Ccg8S ) ;
420+ let ccg8cfp_ver = read_versions ( & data, SiliconId :: Ccg8Cfp ) ;
405421 assert ! ( ccg3_ver. is_none( ) ) ;
406422 assert ! ( ccg5_ver. is_none( ) ) ;
407423 assert ! ( ccg6_ver. is_some( ) ) ;
408- assert ! ( ccg8_ver. is_none( ) ) ;
424+ assert ! ( ccg8d_ver. is_none( ) ) ;
425+ assert ! ( ccg8s_ver. is_none( ) ) ;
426+ assert ! ( ccg8cfp_ver. is_none( ) ) ;
409427
410428 assert_eq ! (
411429 ccg6_ver,
@@ -463,11 +481,15 @@ mod tests {
463481 let ccg3_ver = read_versions ( & data, SiliconId :: Ccg3 ) ;
464482 let ccg5_ver = read_versions ( & data, SiliconId :: Ccg5 ) ;
465483 let ccg6_ver = read_versions ( & data, SiliconId :: Ccg6 ) ;
466- let ccg8_ver = read_versions ( & data, SiliconId :: Ccg8 ) ;
484+ let ccg8d_ver = read_versions ( & data, SiliconId :: Ccg8D ) ;
485+ let ccg8s_ver = read_versions ( & data, SiliconId :: Ccg8S ) ;
486+ let ccg8cfp_ver = read_versions ( & data, SiliconId :: Ccg8Cfp ) ;
467487 assert ! ( ccg3_ver. is_none( ) ) ;
468488 assert ! ( ccg5_ver. is_none( ) ) ;
469489 assert ! ( ccg6_ver. is_some( ) ) ;
470- assert ! ( ccg8_ver. is_none( ) ) ;
490+ assert ! ( ccg8d_ver. is_none( ) ) ;
491+ assert ! ( ccg8s_ver. is_none( ) ) ;
492+ assert ! ( ccg8cfp_ver. is_none( ) ) ;
471493
472494 assert_eq ! (
473495 ccg6_ver,
@@ -525,14 +547,18 @@ mod tests {
525547 let ccg3_ver = read_versions ( & data, SiliconId :: Ccg3 ) ;
526548 let ccg5_ver = read_versions ( & data, SiliconId :: Ccg5 ) ;
527549 let ccg6_ver = read_versions ( & data, SiliconId :: Ccg6 ) ;
528- let ccg8_ver = read_versions ( & data, SiliconId :: Ccg8 ) ;
550+ let ccg8d_ver = read_versions ( & data, SiliconId :: Ccg8D ) ;
551+ let ccg8s_ver = read_versions ( & data, SiliconId :: Ccg8S ) ;
552+ let ccg8cfp_ver = read_versions ( & data, SiliconId :: Ccg8Cfp ) ;
529553 assert ! ( ccg3_ver. is_none( ) ) ;
530554 assert ! ( ccg5_ver. is_none( ) ) ;
531555 assert ! ( ccg6_ver. is_none( ) ) ;
532- assert ! ( ccg8_ver. is_some( ) ) ;
556+ assert ! ( ccg8d_ver. is_some( ) ) ;
557+ assert ! ( ccg8s_ver. is_some( ) ) ;
558+ assert ! ( ccg8cfp_ver. is_none( ) ) ;
533559
534560 assert_eq ! (
535- ccg8_ver ,
561+ ccg8d_ver ,
536562 Some ( {
537563 PdFirmwareFile {
538564 backup_fw: PdFirmware {
@@ -587,14 +613,18 @@ mod tests {
587613 let ccg3_ver = read_versions ( & data, SiliconId :: Ccg3 ) ;
588614 let ccg5_ver = read_versions ( & data, SiliconId :: Ccg5 ) ;
589615 let ccg6_ver = read_versions ( & data, SiliconId :: Ccg6 ) ;
590- let ccg8_ver = read_versions ( & data, SiliconId :: Ccg8 ) ;
616+ let ccg8d_ver = read_versions ( & data, SiliconId :: Ccg8D ) ;
617+ let ccg8s_ver = read_versions ( & data, SiliconId :: Ccg8S ) ;
618+ let ccg8cfp_ver = read_versions ( & data, SiliconId :: Ccg8Cfp ) ;
591619 assert ! ( ccg3_ver. is_none( ) ) ;
592620 assert ! ( ccg5_ver. is_none( ) ) ;
593621 assert ! ( ccg6_ver. is_none( ) ) ;
594- assert ! ( ccg8_ver. is_some( ) ) ;
622+ assert ! ( ccg8d_ver. is_some( ) ) ;
623+ assert ! ( ccg8s_ver. is_some( ) ) ;
624+ assert ! ( ccg8cfp_ver. is_none( ) ) ;
595625
596626 assert_eq ! (
597- ccg8_ver ,
627+ ccg8d_ver ,
598628 Some ( {
599629 PdFirmwareFile {
600630 backup_fw: PdFirmware {
@@ -649,14 +679,18 @@ mod tests {
649679 let ccg3_ver = read_versions ( & data, SiliconId :: Ccg3 ) ;
650680 let ccg5_ver = read_versions ( & data, SiliconId :: Ccg5 ) ;
651681 let ccg6_ver = read_versions ( & data, SiliconId :: Ccg6 ) ;
652- let ccg8_ver = read_versions ( & data, SiliconId :: Ccg8 ) ;
682+ let ccg8d_ver = read_versions ( & data, SiliconId :: Ccg8D ) ;
683+ let ccg8s_ver = read_versions ( & data, SiliconId :: Ccg8S ) ;
684+ let ccg8cfp_ver = read_versions ( & data, SiliconId :: Ccg8Cfp ) ;
653685 assert ! ( ccg3_ver. is_none( ) ) ;
654686 assert ! ( ccg5_ver. is_none( ) ) ;
655687 assert ! ( ccg6_ver. is_none( ) ) ;
656- assert ! ( ccg8_ver. is_some( ) ) ;
688+ assert ! ( ccg8d_ver. is_some( ) ) ;
689+ assert ! ( ccg8s_ver. is_some( ) ) ;
690+ assert ! ( ccg8cfp_ver. is_none( ) ) ;
657691
658692 assert_eq ! (
659- ccg8_ver ,
693+ ccg8s_ver ,
660694 Some ( {
661695 PdFirmwareFile {
662696 backup_fw: PdFirmware {
@@ -701,4 +735,70 @@ mod tests {
701735 } )
702736 ) ;
703737 }
738+
739+ #[ test]
740+ fn can_parse_ccg8_binary_cfp ( ) {
741+ let mut pd_bin_path = PathBuf :: from ( env ! ( "CARGO_MANIFEST_DIR" ) ) ;
742+ pd_bin_path. push ( "test_bins/ccg8-cfp.bin" ) ;
743+
744+ let data = fs:: read ( pd_bin_path) . unwrap ( ) ;
745+ let ccg3_ver = read_versions ( & data, SiliconId :: Ccg3 ) ;
746+ let ccg5_ver = read_versions ( & data, SiliconId :: Ccg5 ) ;
747+ let ccg6_ver = read_versions ( & data, SiliconId :: Ccg6 ) ;
748+ let ccg8d_ver = read_versions ( & data, SiliconId :: Ccg8D ) ;
749+ let ccg8s_ver = read_versions ( & data, SiliconId :: Ccg8S ) ;
750+ let ccg8cfp_ver = read_versions ( & data, SiliconId :: Ccg8Cfp ) ;
751+ assert ! ( ccg3_ver. is_none( ) ) ;
752+ assert ! ( ccg5_ver. is_none( ) ) ;
753+ assert ! ( ccg6_ver. is_none( ) ) ;
754+ assert ! ( ccg8d_ver. is_none( ) ) ;
755+ assert ! ( ccg8s_ver. is_none( ) ) ;
756+ assert ! ( ccg8cfp_ver. is_some( ) ) ;
757+
758+ assert_eq ! (
759+ ccg8cfp_ver,
760+ Some ( {
761+ PdFirmwareFile {
762+ backup_fw: PdFirmware {
763+ silicon_id: 0x11CE ,
764+ silicon_family: 0x3E81 ,
765+ base_version: BaseVersion {
766+ major: 3 ,
767+ minor: 7 ,
768+ patch: 1 ,
769+ build_number: 554 ,
770+ } ,
771+ app_version: AppVersion {
772+ application: Application :: Notebook ,
773+ major: 0 ,
774+ minor: 0 ,
775+ circuit: 3 ,
776+ } ,
777+ start_row: 108 ,
778+ size: 77884 ,
779+ row_size: 0x100 ,
780+ } ,
781+ main_fw: PdFirmware {
782+ silicon_id: 0x11CE ,
783+ silicon_family: 0x3E81 ,
784+ base_version: BaseVersion {
785+ major: 3 ,
786+ minor: 7 ,
787+ patch: 1 ,
788+ build_number: 554 ,
789+ } ,
790+ app_version: AppVersion {
791+ application: Application :: Notebook ,
792+ major: 0 ,
793+ minor: 0 ,
794+ circuit: 3 ,
795+ } ,
796+ start_row: 7 ,
797+ size: 23840 ,
798+ row_size: 0x100 ,
799+ } ,
800+ }
801+ } )
802+ ) ;
803+ }
704804}
0 commit comments