Read version information about FW based on a particular metadata offset There can be multiple metadata and FW regions in the image, so it's required to specify which metadata region to read from.
(
file_buffer: &[u8],
flash_row_size: usize,
metadata_offset: u32,
ccgx: SiliconId,
)
| 138 | /// There can be multiple metadata and FW regions in the image, |
| 139 | /// so it's required to specify which metadata region to read from. |
| 140 | fn read_version( |
| 141 | file_buffer: &[u8], |
| 142 | flash_row_size: usize, |
| 143 | metadata_offset: u32, |
| 144 | ccgx: SiliconId, |
| 145 | ) -> Option<PdFirmware> { |
| 146 | let (fw_row_start, fw_size) = |
| 147 | read_metadata(file_buffer, flash_row_size, metadata_offset, ccgx)?; |
| 148 | let data = read_256_bytes(file_buffer, fw_row_start, flash_row_size)?; |
| 149 | trace!("First row of firmware: {:X?}", data); |
| 150 | let data = &data[FW_VERSION_OFFSET..]; |
| 151 | |
| 152 | let (version_info, _) = VersionInfo::read_from_prefix(data).ok()?; |
| 153 | |
| 154 | let base_version = BaseVersion::from(version_info.base_version.get()); |
| 155 | let app_version = AppVersion::from(version_info.app_version.get()); |
| 156 | |
| 157 | let fw_silicon_id = version_info.silicon_id.get(); |
| 158 | let fw_silicon_family = version_info.silicon_family.get(); |
| 159 | |
| 160 | Some(PdFirmware { |
| 161 | silicon_id: fw_silicon_id, |
| 162 | silicon_family: fw_silicon_family, |
| 163 | base_version, |
| 164 | app_version, |
| 165 | start_row: fw_row_start, |
| 166 | size: fw_size as usize, |
| 167 | row_size: flash_row_size, |
| 168 | }) |
| 169 | } |
| 170 | |
| 171 | /// Parse all PD information, given a binary file (buffer) |
| 172 | pub fn read_versions(file_buffer: &[u8], ccgx: SiliconId) -> Option<PdFirmwareFile> { |
no test coverage detected