use crate::controllers::{is_bank_empty, FlashBank, FlashIdResult};
const JEDEC_IDS: &[u8] = &[
0x01, 0x04, 0x07, 0x20, 0x2C, 0x45, 0x4A, 0x89, 0x92, 0x98, 0x9B, 0xAD, 0xB5, 0xC2, 0xC8, 0xEC, 0xEF, ];
const ATA_ID_FID_OFFSET: usize = 0x127;
const ATA_ID_FID_LEN: usize = 8;
pub fn extract_from_identify(id_data: &[u8; 512]) -> Option<FlashIdResult> {
if ATA_ID_FID_OFFSET + ATA_ID_FID_LEN > id_data.len() {
return None;
}
let fid = &id_data[ATA_ID_FID_OFFSET..ATA_ID_FID_OFFSET + ATA_ID_FID_LEN];
if is_bank_empty(fid) {
return None;
}
if !JEDEC_IDS.contains(&fid[0]) {
return None;
}
let mut flash_id = [0u8; 8];
flash_id.copy_from_slice(fid);
Some(FlashIdResult {
controller_name: "SATA (from ATA IDENTIFY)".to_string(),
banks: vec![FlashBank {
bank_num: 0,
flash_id,
}],
})
}