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 numberDiff line numberDiff 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 DownExpand 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 DownExpand 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 DownExpand 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 DownExpand 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 DownExpand 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 DownExpand 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 DownExpand 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 DownExpand 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 DownExpand 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 DownExpand 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 numberDiff line numberDiff 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 DownExpand 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 numberDiff line numberDiff 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