diff --git a/assets/sc64_logo_256_256.png b/assets/sc64_logo_256_256.png deleted file mode 100644 index 670d1df..0000000 Binary files a/assets/sc64_logo_256_256.png and /dev/null differ diff --git a/sw/deployer/src/main.rs b/sw/deployer/src/main.rs index c2b52cb..c46ad12 100644 --- a/sw/deployer/src/main.rs +++ b/sw/deployer/src/main.rs @@ -379,7 +379,7 @@ fn handle_info_command(sn: Option) -> Result<(), sc64::Error> { let datetime = state.datetime.format("%Y-%m-%d %H:%M:%S %Z"); println!("{}", "SC64 information and current state:".bold()); - println!(" Firmware version: {}.{}", major, minor); + println!(" Firmware version: v{}.{}", major, minor); println!(" RTC datetime: {}", datetime); println!(" Boot mode: {}", state.boot_mode); println!(" Save type: {}", state.save_type); diff --git a/sw/deployer/src/sc64/cic.rs b/sw/deployer/src/sc64/cic.rs index b5a3a41..f1ebe78 100644 --- a/sw/deployer/src/sc64/cic.rs +++ b/sw/deployer/src/sc64/cic.rs @@ -4,29 +4,75 @@ use crc32fast::Hasher; pub const IPL3_OFFSET: u32 = 0x40; pub const IPL3_LENGTH: usize = 0xFC0; +enum CicType { + _5101, + _6101, + _7102, + X102, + X103, + X105, + X106, + _5167, + NDXJ0, + NDDJ0, + NDDJ1, + NDDJ2, + NDDE0, +} + +impl From for CicType { + fn from(value: u32) -> Self { + match value { + 0x587BD543 => CicType::_5101, + 0x6170A4A1 => CicType::_6101, + 0x009E9EA3 => CicType::_7102, + 0x90BB6CB5 => CicType::X102, + 0x0B050EE0 => CicType::X103, + 0x98BC2C86 => CicType::X105, + 0xACC8580A => CicType::X106, + 0x0E018159 => CicType::_5167, + 0x10C68B18 => CicType::NDXJ0, + 0xBC605D0A => CicType::NDDJ0, + 0x502C4466 => CicType::NDDJ1, + 0x0C965795 => CicType::NDDJ2, + 0x8FEBA21E => CicType::NDDE0, + _ => CicType::X102, + } + } +} + +impl From for u8 { + fn from(value: CicType) -> Self { + match value { + CicType::_5101 => 0xAC, + CicType::_6101 => 0x3F, + CicType::_7102 => 0x3F, + CicType::X102 => 0x3F, + CicType::X103 => 0x78, + CicType::X105 => 0x91, + CicType::X106 => 0x85, + CicType::_5167 => 0xDD, + CicType::NDXJ0 => 0xDD, + CicType::NDDJ0 => 0xDD, + CicType::NDDJ1 => 0xDD, + CicType::NDDJ2 => 0xDD, + CicType::NDDE0 => 0xDE, + } + } +} + pub fn guess_ipl3_seed(ipl3: &[u8]) -> Result { if ipl3.len() < IPL3_LENGTH { return Err(Error::new("Invalid IPL3 length provided")); } let mut hasher = Hasher::new(); + hasher.update(ipl3); - Ok(match hasher.finalize() { - 0x587BD543 => 0xAC, // 5101 - 0x6170A4A1 => 0x3F, // 6101 - 0x009E9EA3 => 0x3F, // 7102 - 0x90BB6CB5 => 0x3F, // 6102/7101 - 0x0B050EE0 => 0x78, // x103 - 0x98BC2C86 => 0x91, // x105 - 0xACC8580A => 0x85, // x106 - 0x0E018159 => 0xDD, // 5167 - 0x10C68B18 => 0xDD, // NDXJ0 - 0xBC605D0A => 0xDD, // NDDJ0 - 0x502C4466 => 0xDD, // NDDJ1 - 0x0C965795 => 0xDD, // NDDJ2 - 0x8FEBA21E => 0xDE, // NDDE0 - _ => 0x3F, - }) + + let cic_type: CicType = hasher.finalize().into(); + + Ok(cic_type.into()) } pub fn calculate_ipl3_checksum(ipl3: &[u8], seed: u8) -> Result<[u8; 6], Error> { @@ -43,7 +89,6 @@ pub fn calculate_ipl3_checksum(ipl3: &[u8], seed: u8) -> Result<[u8; 6], Error> | ((ipl3[o + 2] as u32) << 8) | (ipl3[o + 3] as u32); }; - let add = |a1: u32, a2: u32| u32::wrapping_add(a1, a2); let sub = |a1: u32, a2: u32| u32::wrapping_sub(a1, a2); let mul = |a1: u32, a2: u32| u32::wrapping_mul(a1, a2); diff --git a/sw/deployer/src/sc64/mod.rs b/sw/deployer/src/sc64/mod.rs index 35e89fb..ec506da 100644 --- a/sw/deployer/src/sc64/mod.rs +++ b/sw/deployer/src/sc64/mod.rs @@ -17,8 +17,8 @@ use self::{ cic::{calculate_ipl3_checksum, guess_ipl3_seed, IPL3_LENGTH, IPL3_OFFSET}, link::{Command, Link}, types::{ - get_config, get_setting, ButtonMode, CicSeed, Config, ConfigId, FirmwareStatus, Setting, - SettingId, UpdateStatus, Switch, ButtonState, + get_config, get_setting, ButtonMode, ButtonState, CicSeed, Config, ConfigId, + FirmwareStatus, Setting, SettingId, Switch, UpdateStatus, }, utils::{args_from_vec, datetime_from_vec, u32_from_vec, vec_from_datetime}, }; @@ -94,7 +94,7 @@ const ISV_BUFFER_LENGTH: usize = 64 * 1024; pub const MEMORY_LENGTH: usize = 0x0500_2980; -const MEMORY_WRITE_CHUNK_SIZE: usize = 1 * 1024 * 1024; +const MEMORY_WRITE_CHUNK_LENGTH: usize = 1 * 1024 * 1024; impl SC64 { fn command_identifier_get(&mut self) -> Result, Error> { @@ -530,8 +530,7 @@ impl SC64 { } pub fn reset_state(&mut self) -> Result<(), Error> { - self.command_state_reset()?; - Ok(()) + self.command_state_reset() } pub fn backup_firmware(&mut self) -> Result, Error> { @@ -567,7 +566,7 @@ impl SC64 { UpdateStatus::Err => { return Err(Error::new( format!( - "Firmware update error on step {}, device is most likely bricked", + "Firmware update error on step {}, device is, most likely, bricked", last_update_status ) .as_str(), @@ -604,8 +603,8 @@ impl SC64 { length: usize, transform: Option, ) -> Result<(), Error> { - let mut data: Vec = vec![0u8; MEMORY_WRITE_CHUNK_SIZE]; - for offset in (0..length).step_by(MEMORY_WRITE_CHUNK_SIZE) { + let mut data: Vec = vec![0u8; MEMORY_WRITE_CHUNK_LENGTH]; + for offset in (0..length).step_by(MEMORY_WRITE_CHUNK_LENGTH) { let chunk = reader.read(&mut data)?; if let Some(transform) = transform { transform(&mut data); diff --git a/sw/deployer/src/sc64/types.rs b/sw/deployer/src/sc64/types.rs index 1edff6f..b7ced4e 100644 --- a/sw/deployer/src/sc64/types.rs +++ b/sw/deployer/src/sc64/types.rs @@ -107,7 +107,6 @@ impl From for [u32; 2] { } } -#[derive(Copy, Clone)] pub enum Switch { Off, On,