Skip to content

Commit 5623314

Browse files
committed
sakura: Add support for CCG8 CFP binaries
Signed-off-by: Daniel Schaefer <dhs@frame.work>
1 parent 7c3e552 commit 5623314

3 files changed

Lines changed: 135 additions & 31 deletions

File tree

framework_lib/src/ccgx/binary.rs

Lines changed: 124 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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(
172172
pub 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
}

framework_lib/src/ccgx/mod.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,6 @@ pub mod device;
2323
#[cfg(feature = "hidapi")]
2424
pub mod hid;
2525

26-
const FW1_METADATA_ROW: u32 = 0x1FE;
27-
const FW1_METADATA_ROW_CCG8: u32 = 0x3FE;
28-
const FW2_METADATA_ROW_CCG5: u32 = 0x1FF;
29-
const FW2_METADATA_ROW_CCG6: u32 = 0x1FD;
30-
const FW2_METADATA_ROW_CCG8: u32 = 0x3FF;
3126
const METADATA_OFFSET: usize = 0xC0; // TODO: Is this 0x40 on ADL?
3227
const CCG8_METADATA_OFFSET: usize = 0x80;
3328
const CCG3_METADATA_OFFSET: usize = 0x40;
@@ -109,7 +104,9 @@ pub enum SiliconId {
109104
Ccg5 = 0x2100,
110105
Ccg6Adl = 0x3000,
111106
Ccg6 = 0x30A0,
112-
Ccg8 = 0x3580,
107+
Ccg8D = 0x3580,
108+
Ccg8S = 0x3581,
109+
Ccg8Cfp = 0x3E81,
113110
}
114111

115112
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Copy, Clone)]

framework_lib/src/commandline/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2610,7 +2610,14 @@ fn analyze_ccgx_pd_fw(data: &[u8]) {
26102610

26112611
println!("FW 2");
26122612
ccgx::binary::print_fw(&versions.main_fw);
2613-
} else if let Some(versions) = ccgx::binary::read_versions(data, Ccg8) {
2613+
} else if let Some(versions) = ccgx::binary::read_versions(data, Ccg8D) {
2614+
println!("Detected CCG8D/CCG8S firmware");
2615+
println!("FW 1");
2616+
ccgx::binary::print_fw(&versions.backup_fw);
2617+
2618+
println!("FW 2");
2619+
ccgx::binary::print_fw(&versions.main_fw);
2620+
} else if let Some(versions) = ccgx::binary::read_versions(data, Ccg8Cfp) {
26142621
println!("Detected CCG8 firmware");
26152622
println!("FW 1");
26162623
ccgx::binary::print_fw(&versions.backup_fw);

0 commit comments

Comments
 (0)