diff --git a/framework_lib/src/ccgx/binary.rs b/framework_lib/src/ccgx/binary.rs index cb324221..317a7c79 100644 --- a/framework_lib/src/ccgx/binary.rs +++ b/framework_lib/src/ccgx/binary.rs @@ -84,7 +84,8 @@ pub struct PdFirmware { } // Hexdump -// 0x4359 is the metadata magic bytes +// 0x4359 is the metadata magic bytes (CY - Cypress) +// 0x4649 is the metadata magic bytes (IF - Infineon) // // FW1 // 000ff40 5d84 0040 7500 0000 8000 00be 0000 0000 @@ -330,7 +331,7 @@ mod tests { } #[test] - fn can_parse_ccg6_binary() { + fn can_parse_ccg6_binary_adl() { let mut pd_bin_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); pd_bin_path.push("test_bins/adl-pd-0.1.33.bin"); @@ -391,6 +392,130 @@ mod tests { ); } + #[test] + fn can_parse_ccg6_binary_mtl() { + let mut pd_bin_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + pd_bin_path.push("test_bins/mtl-pd-0.0.A.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 ccg8_ver = read_versions(&data, SiliconId::Ccg8); + assert!(ccg3_ver.is_none()); + assert!(ccg5_ver.is_none()); + assert!(ccg6_ver.is_some()); + assert!(ccg8_ver.is_none()); + + assert_eq!( + ccg6_ver, + Some({ + PdFirmwareFile { + backup_fw: PdFirmware { + silicon_id: 0x11C0, + silicon_family: 0x3000, + base_version: BaseVersion { + major: 3, + minor: 6, + patch: 0, + build_number: 115, + }, + app_version: AppVersion { + application: Application::Notebook, + major: 0, + minor: 0, + circuit: 0x0A, + }, + start_row: 10, + size: 12288, + row_size: 128, + }, + main_fw: PdFirmware { + silicon_id: 0x11C0, + silicon_family: 0x3000, + base_version: BaseVersion { + major: 3, + minor: 6, + patch: 0, + build_number: 115, + }, + app_version: AppVersion { + application: Application::Notebook, + major: 0, + minor: 0, + circuit: 0x0A, + }, + start_row: 112, + size: 47744, + row_size: 128, + }, + } + }) + ); + } + + #[test] + fn can_parse_ccg6_binary_desktop() { + let mut pd_bin_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + pd_bin_path.push("test_bins/dogwood-pd-0.0E.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 ccg8_ver = read_versions(&data, SiliconId::Ccg8); + assert!(ccg3_ver.is_none()); + assert!(ccg5_ver.is_none()); + assert!(ccg6_ver.is_some()); + assert!(ccg8_ver.is_none()); + + assert_eq!( + ccg6_ver, + Some({ + PdFirmwareFile { + backup_fw: PdFirmware { + silicon_id: 0x11C0, + silicon_family: 0x3000, + base_version: BaseVersion { + major: 3, + minor: 7, + patch: 0, + build_number: 159, + }, + app_version: AppVersion { + application: Application::Notebook, + major: 0, + minor: 0, + circuit: 0x0E, + }, + start_row: 10, + size: 9344, + row_size: 128, + }, + main_fw: PdFirmware { + silicon_id: 0x11C0, + silicon_family: 0x3000, + base_version: BaseVersion { + major: 3, + minor: 7, + patch: 0, + build_number: 159, + }, + app_version: AppVersion { + application: Application::Notebook, + major: 0, + minor: 0, + circuit: 0x0E, + }, + start_row: 112, + size: 50816, + row_size: 128, + }, + } + }) + ); + } + #[test] fn can_parse_ccg8_binary() { let mut pd_bin_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); @@ -452,4 +577,128 @@ mod tests { }) ); } + + #[test] + fn can_parse_ccg8_binary_fl16_ai300() { + let mut pd_bin_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + pd_bin_path.push("test_bins/fl16-ai300-pd-0.0.22.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 ccg8_ver = read_versions(&data, SiliconId::Ccg8); + assert!(ccg3_ver.is_none()); + assert!(ccg5_ver.is_none()); + assert!(ccg6_ver.is_none()); + assert!(ccg8_ver.is_some()); + + assert_eq!( + ccg8_ver, + Some({ + PdFirmwareFile { + backup_fw: PdFirmware { + silicon_id: 0x11C5, + silicon_family: 0x3580, + base_version: BaseVersion { + major: 3, + minor: 7, + patch: 0, + build_number: 407, + }, + app_version: AppVersion { + application: Application::Notebook, + major: 0, + minor: 0, + circuit: 0x22, + }, + start_row: 290, + size: 129912, + row_size: 0x100, + }, + main_fw: PdFirmware { + silicon_id: 0x11C5, + silicon_family: 0x3580, + base_version: BaseVersion { + major: 3, + minor: 7, + patch: 0, + build_number: 407, + }, + app_version: AppVersion { + application: Application::Notebook, + major: 0, + minor: 0, + circuit: 0x22, + }, + start_row: 29, + size: 42816, + row_size: 0x100, + }, + } + }) + ); + } + + #[test] + fn can_parse_ccg8_binary_gnss() { + let mut pd_bin_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + pd_bin_path.push("test_bins/gn22-pd-0.0.22.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 ccg8_ver = read_versions(&data, SiliconId::Ccg8); + assert!(ccg3_ver.is_none()); + assert!(ccg5_ver.is_none()); + assert!(ccg6_ver.is_none()); + assert!(ccg8_ver.is_some()); + + assert_eq!( + ccg8_ver, + Some({ + PdFirmwareFile { + backup_fw: PdFirmware { + silicon_id: 0x11C5, + silicon_family: 0x3581, + base_version: BaseVersion { + major: 3, + minor: 7, + patch: 0, + build_number: 407, + }, + app_version: AppVersion { + application: Application::Notebook, + major: 0, + minor: 0, + circuit: 0x22, + }, + start_row: 290, + size: 126700, + row_size: 0x100, + }, + main_fw: PdFirmware { + silicon_id: 0x11C5, + silicon_family: 0x3581, + base_version: BaseVersion { + major: 3, + minor: 7, + patch: 0, + build_number: 407, + }, + app_version: AppVersion { + application: Application::Notebook, + major: 0, + minor: 0, + circuit: 0x22, + }, + start_row: 29, + size: 41588, + row_size: 0x100, + }, + } + }) + ); + } } diff --git a/framework_lib/test_bins/dogwood-pd-0.0E.bin b/framework_lib/test_bins/dogwood-pd-0.0E.bin new file mode 100644 index 00000000..a03a4ae1 Binary files /dev/null and b/framework_lib/test_bins/dogwood-pd-0.0E.bin differ diff --git a/framework_lib/test_bins/fl16-ai300-pd-0.0.22.bin b/framework_lib/test_bins/fl16-ai300-pd-0.0.22.bin new file mode 100644 index 00000000..e01367a5 Binary files /dev/null and b/framework_lib/test_bins/fl16-ai300-pd-0.0.22.bin differ diff --git a/framework_lib/test_bins/gn22-pd-0.0.22.bin b/framework_lib/test_bins/gn22-pd-0.0.22.bin new file mode 100644 index 00000000..b3067e20 Binary files /dev/null and b/framework_lib/test_bins/gn22-pd-0.0.22.bin differ diff --git a/framework_lib/test_bins/mtl-pd-0.0.A.bin b/framework_lib/test_bins/mtl-pd-0.0.A.bin new file mode 100644 index 00000000..2f4f078c Binary files /dev/null and b/framework_lib/test_bins/mtl-pd-0.0.A.bin differ