Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
148 changes: 124 additions & 24 deletions framework_lib/src/ccgx/binary.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ fn read_metadata(
match ccgx {
SiliconId::Ccg3 => parse_metadata_ccg3(&buffer),
SiliconId::Ccg5 | SiliconId::Ccg6Adl | SiliconId::Ccg6 => parse_metadata_cyacd(&buffer),
SiliconId::Ccg8 => parse_metadata_cyacd2(&buffer)
SiliconId::Ccg8D | SiliconId::Ccg8S | SiliconId::Ccg8Cfp => parse_metadata_cyacd2(&buffer)
.map(|(fw_row_start, fw_size)| (fw_row_start / (flash_row_size as u32), fw_size)),
}
}
Expand Down Expand Up @@ -172,10 +172,12 @@ fn read_version(
pub fn read_versions(file_buffer: &[u8], ccgx: SiliconId) -> Option<PdFirmwareFile> {
let (flash_row_size, f1_metadata_row, fw2_metadata_row) = match ccgx {
SiliconId::Ccg3 => (SMALL_ROW, 0x03FF, 0x03FE),
SiliconId::Ccg5 => (LARGE_ROW, FW1_METADATA_ROW, FW2_METADATA_ROW_CCG5),
SiliconId::Ccg6Adl => (SMALL_ROW, FW1_METADATA_ROW, FW2_METADATA_ROW_CCG6),
SiliconId::Ccg6 => (SMALL_ROW, FW1_METADATA_ROW, FW2_METADATA_ROW_CCG6),
SiliconId::Ccg8 => (LARGE_ROW, FW1_METADATA_ROW_CCG8, FW2_METADATA_ROW_CCG8),
SiliconId::Ccg5 => (LARGE_ROW, 0x1FE, 0x1FF),
SiliconId::Ccg6Adl => (SMALL_ROW, 0x1FE, 0x1FD),
SiliconId::Ccg6 => (SMALL_ROW, 0x1FE, 0x1FD),
SiliconId::Ccg8D => (LARGE_ROW, 0x3FE, 0x3FF),
SiliconId::Ccg8S => (LARGE_ROW, 0x3FE, 0x3FF),
SiliconId::Ccg8Cfp => (LARGE_ROW, 0x1FE, 0x1FF),
};
let backup_fw = read_version(file_buffer, flash_row_size, f1_metadata_row, ccgx)?;
let main_fw = read_version(file_buffer, flash_row_size, fw2_metadata_row, ccgx)?;
Expand Down Expand Up @@ -215,11 +217,15 @@ mod tests {
let ccg3_ver = read_versions(&data, SiliconId::Ccg3);
let ccg5_ver = read_versions(&data, SiliconId::Ccg5);
let ccg6_ver = read_versions(&data, SiliconId::Ccg6);
let ccg8_ver = read_versions(&data, SiliconId::Ccg8);
let ccg8d_ver = read_versions(&data, SiliconId::Ccg8D);
let ccg8s_ver = read_versions(&data, SiliconId::Ccg8S);
let ccg8cfp_ver = read_versions(&data, SiliconId::Ccg8Cfp);
assert!(ccg3_ver.is_some());
assert!(ccg5_ver.is_none());
assert!(ccg6_ver.is_none());
assert!(ccg8_ver.is_none());
assert!(ccg8d_ver.is_none());
assert!(ccg8s_ver.is_none());
assert!(ccg8cfp_ver.is_none());

assert_eq!(
ccg3_ver,
Expand Down Expand Up @@ -277,11 +283,15 @@ mod tests {
let ccg3_ver = read_versions(&data, SiliconId::Ccg3);
let ccg5_ver = read_versions(&data, SiliconId::Ccg5);
let ccg6_ver = read_versions(&data, SiliconId::Ccg6);
let ccg8_ver = read_versions(&data, SiliconId::Ccg8);
let ccg8d_ver = read_versions(&data, SiliconId::Ccg8D);
let ccg8s_ver = read_versions(&data, SiliconId::Ccg8S);
let ccg8cfp_ver = read_versions(&data, SiliconId::Ccg8Cfp);
assert!(ccg3_ver.is_none());
assert!(ccg5_ver.is_some());
assert!(ccg6_ver.is_none());
assert!(ccg8_ver.is_none());
assert!(ccg8d_ver.is_none());
assert!(ccg8s_ver.is_none());
assert!(ccg8cfp_ver.is_none());

assert_eq!(
ccg5_ver,
Expand Down Expand Up @@ -339,11 +349,15 @@ mod tests {
let ccg3_ver = read_versions(&data, SiliconId::Ccg3);
let ccg5_ver = read_versions(&data, SiliconId::Ccg5);
let ccg6_ver = read_versions(&data, SiliconId::Ccg6);
let ccg8_ver = read_versions(&data, SiliconId::Ccg8);
let ccg8d_ver = read_versions(&data, SiliconId::Ccg8D);
let ccg8s_ver = read_versions(&data, SiliconId::Ccg8S);
let ccg8cfp_ver = read_versions(&data, SiliconId::Ccg8Cfp);
assert!(ccg3_ver.is_none());
assert!(ccg5_ver.is_none());
assert!(ccg6_ver.is_some());
assert!(ccg8_ver.is_none());
assert!(ccg8d_ver.is_none());
assert!(ccg8s_ver.is_none());
assert!(ccg8cfp_ver.is_none());

assert_eq!(
ccg6_ver,
Expand Down Expand Up @@ -401,11 +415,15 @@ mod tests {
let ccg3_ver = read_versions(&data, SiliconId::Ccg3);
let ccg5_ver = read_versions(&data, SiliconId::Ccg5);
let ccg6_ver = read_versions(&data, SiliconId::Ccg6);
let ccg8_ver = read_versions(&data, SiliconId::Ccg8);
let ccg8d_ver = read_versions(&data, SiliconId::Ccg8D);
let ccg8s_ver = read_versions(&data, SiliconId::Ccg8S);
let ccg8cfp_ver = read_versions(&data, SiliconId::Ccg8Cfp);
assert!(ccg3_ver.is_none());
assert!(ccg5_ver.is_none());
assert!(ccg6_ver.is_some());
assert!(ccg8_ver.is_none());
assert!(ccg8d_ver.is_none());
assert!(ccg8s_ver.is_none());
assert!(ccg8cfp_ver.is_none());

assert_eq!(
ccg6_ver,
Expand Down Expand Up @@ -463,11 +481,15 @@ mod tests {
let ccg3_ver = read_versions(&data, SiliconId::Ccg3);
let ccg5_ver = read_versions(&data, SiliconId::Ccg5);
let ccg6_ver = read_versions(&data, SiliconId::Ccg6);
let ccg8_ver = read_versions(&data, SiliconId::Ccg8);
let ccg8d_ver = read_versions(&data, SiliconId::Ccg8D);
let ccg8s_ver = read_versions(&data, SiliconId::Ccg8S);
let ccg8cfp_ver = read_versions(&data, SiliconId::Ccg8Cfp);
assert!(ccg3_ver.is_none());
assert!(ccg5_ver.is_none());
assert!(ccg6_ver.is_some());
assert!(ccg8_ver.is_none());
assert!(ccg8d_ver.is_none());
assert!(ccg8s_ver.is_none());
assert!(ccg8cfp_ver.is_none());

assert_eq!(
ccg6_ver,
Expand Down Expand Up @@ -525,14 +547,18 @@ mod tests {
let ccg3_ver = read_versions(&data, SiliconId::Ccg3);
let ccg5_ver = read_versions(&data, SiliconId::Ccg5);
let ccg6_ver = read_versions(&data, SiliconId::Ccg6);
let ccg8_ver = read_versions(&data, SiliconId::Ccg8);
let ccg8d_ver = read_versions(&data, SiliconId::Ccg8D);
let ccg8s_ver = read_versions(&data, SiliconId::Ccg8S);
let ccg8cfp_ver = read_versions(&data, SiliconId::Ccg8Cfp);
assert!(ccg3_ver.is_none());
assert!(ccg5_ver.is_none());
assert!(ccg6_ver.is_none());
assert!(ccg8_ver.is_some());
assert!(ccg8d_ver.is_some());
assert!(ccg8s_ver.is_some());
assert!(ccg8cfp_ver.is_none());

assert_eq!(
ccg8_ver,
ccg8d_ver,
Some({
PdFirmwareFile {
backup_fw: PdFirmware {
Expand Down Expand Up @@ -587,14 +613,18 @@ mod tests {
let ccg3_ver = read_versions(&data, SiliconId::Ccg3);
let ccg5_ver = read_versions(&data, SiliconId::Ccg5);
let ccg6_ver = read_versions(&data, SiliconId::Ccg6);
let ccg8_ver = read_versions(&data, SiliconId::Ccg8);
let ccg8d_ver = read_versions(&data, SiliconId::Ccg8D);
let ccg8s_ver = read_versions(&data, SiliconId::Ccg8S);
let ccg8cfp_ver = read_versions(&data, SiliconId::Ccg8Cfp);
assert!(ccg3_ver.is_none());
assert!(ccg5_ver.is_none());
assert!(ccg6_ver.is_none());
assert!(ccg8_ver.is_some());
assert!(ccg8d_ver.is_some());
assert!(ccg8s_ver.is_some());
assert!(ccg8cfp_ver.is_none());

assert_eq!(
ccg8_ver,
ccg8d_ver,
Some({
PdFirmwareFile {
backup_fw: PdFirmware {
Expand Down Expand Up @@ -649,14 +679,18 @@ mod tests {
let ccg3_ver = read_versions(&data, SiliconId::Ccg3);
let ccg5_ver = read_versions(&data, SiliconId::Ccg5);
let ccg6_ver = read_versions(&data, SiliconId::Ccg6);
let ccg8_ver = read_versions(&data, SiliconId::Ccg8);
let ccg8d_ver = read_versions(&data, SiliconId::Ccg8D);
let ccg8s_ver = read_versions(&data, SiliconId::Ccg8S);
let ccg8cfp_ver = read_versions(&data, SiliconId::Ccg8Cfp);
assert!(ccg3_ver.is_none());
assert!(ccg5_ver.is_none());
assert!(ccg6_ver.is_none());
assert!(ccg8_ver.is_some());
assert!(ccg8d_ver.is_some());
assert!(ccg8s_ver.is_some());
assert!(ccg8cfp_ver.is_none());

assert_eq!(
ccg8_ver,
ccg8s_ver,
Some({
PdFirmwareFile {
backup_fw: PdFirmware {
Expand Down Expand Up @@ -701,4 +735,70 @@ mod tests {
})
);
}

#[test]
fn can_parse_ccg8_binary_cfp() {
let mut pd_bin_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
pd_bin_path.push("test_bins/ccg8-cfp.bin");

let data = fs::read(pd_bin_path).unwrap();
let ccg3_ver = read_versions(&data, SiliconId::Ccg3);
let ccg5_ver = read_versions(&data, SiliconId::Ccg5);
let ccg6_ver = read_versions(&data, SiliconId::Ccg6);
let ccg8d_ver = read_versions(&data, SiliconId::Ccg8D);
let ccg8s_ver = read_versions(&data, SiliconId::Ccg8S);
let ccg8cfp_ver = read_versions(&data, SiliconId::Ccg8Cfp);
assert!(ccg3_ver.is_none());
assert!(ccg5_ver.is_none());
assert!(ccg6_ver.is_none());
assert!(ccg8d_ver.is_none());
assert!(ccg8s_ver.is_none());
assert!(ccg8cfp_ver.is_some());

assert_eq!(
ccg8cfp_ver,
Some({
PdFirmwareFile {
backup_fw: PdFirmware {
silicon_id: 0x11CE,
silicon_family: 0x3E81,
base_version: BaseVersion {
major: 3,
minor: 7,
patch: 1,
build_number: 554,
},
app_version: AppVersion {
application: Application::Notebook,
major: 0,
minor: 0,
circuit: 3,
},
start_row: 108,
size: 77884,
row_size: 0x100,
},
main_fw: PdFirmware {
silicon_id: 0x11CE,
silicon_family: 0x3E81,
base_version: BaseVersion {
major: 3,
minor: 7,
patch: 1,
build_number: 554,
},
app_version: AppVersion {
application: Application::Notebook,
major: 0,
minor: 0,
circuit: 3,
},
start_row: 7,
size: 23840,
row_size: 0x100,
},
}
})
);
}
}
9 changes: 3 additions & 6 deletions framework_lib/src/ccgx/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,6 @@ pub mod device;
#[cfg(feature = "hidapi")]
pub mod hid;

const FW1_METADATA_ROW: u32 = 0x1FE;
const FW1_METADATA_ROW_CCG8: u32 = 0x3FE;
const FW2_METADATA_ROW_CCG5: u32 = 0x1FF;
const FW2_METADATA_ROW_CCG6: u32 = 0x1FD;
const FW2_METADATA_ROW_CCG8: u32 = 0x3FF;
const METADATA_OFFSET: usize = 0xC0; // TODO: Is this 0x40 on ADL?
const CCG8_METADATA_OFFSET: usize = 0x80;
const CCG3_METADATA_OFFSET: usize = 0x40;
Expand Down Expand Up @@ -109,7 +104,9 @@ pub enum SiliconId {
Ccg5 = 0x2100,
Ccg6Adl = 0x3000,
Ccg6 = 0x30A0,
Ccg8 = 0x3580,
Ccg8D = 0x3580,
Ccg8S = 0x3581,
Ccg8Cfp = 0x3E81,
}

#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Copy, Clone)]
Expand Down
9 changes: 8 additions & 1 deletion framework_lib/src/commandline/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2610,7 +2610,14 @@ fn analyze_ccgx_pd_fw(data: &[u8]) {

println!("FW 2");
ccgx::binary::print_fw(&versions.main_fw);
} else if let Some(versions) = ccgx::binary::read_versions(data, Ccg8) {
} else if let Some(versions) = ccgx::binary::read_versions(data, Ccg8D) {
println!("Detected CCG8D/CCG8S firmware");
println!("FW 1");
ccgx::binary::print_fw(&versions.backup_fw);

println!("FW 2");
ccgx::binary::print_fw(&versions.main_fw);
} else if let Some(versions) = ccgx::binary::read_versions(data, Ccg8Cfp) {
println!("Detected CCG8 firmware");
println!("FW 1");
ccgx::binary::print_fw(&versions.backup_fw);
Expand Down
Loading