From 24a665611e4cb864ee937d0f91803e3b80a639b8 Mon Sep 17 00:00:00 2001 From: Mateusz Faderewski Date: Fri, 3 Mar 2023 12:03:03 +0100 Subject: [PATCH] cleanup --- assets/sc64_logo_256_256.png | Bin 54087 -> 0 bytes sw/deployer/src/main.rs | 2 +- sw/deployer/src/sc64/cic.rs | 79 ++++++++++++++++++++++++++-------- sw/deployer/src/sc64/mod.rs | 15 +++---- sw/deployer/src/sc64/types.rs | 1 - 5 files changed, 70 insertions(+), 27 deletions(-) delete mode 100644 assets/sc64_logo_256_256.png diff --git a/assets/sc64_logo_256_256.png b/assets/sc64_logo_256_256.png deleted file mode 100644 index 670d1dfdf5e7060e90880c70b0a0b122313866e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54087 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⩔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 z z#HH0l{nt@Zyg?tiQL^igH`VO_F0QkYbL5^PiVO$jKO@6Ss{p$mMYP(k2dJJS#>G13 zDr6yxK!XJkYTr&QLLR>+Hnc6Ju;5 z{Y~0NMT3~QcMCKyU{Whg^XlbsXH;-wxuJgybBuAhjN7COSs~Xs#fKuMYUr(DN1C>K zo(r%wH}+I`WpYB#zBr$14v8%>dk9clY8>%`p1q78YoLA-S~eNfT63yG0%{d(83)e< zKD__SRW*w&=^g`Ztq<}*D%JtI3G{!1O^^>xP($+M}ubUl7^ z^5i&!L)TG~uauv=r-b?gsm5K#${wl3un1Tu5T~?P_cQ^z5H~vlyX;bfVRnHt6wuH0 zZv2f{4hrdEdQ8*iFt?3i*Rv+szb?7QMGnhT(xPf$?E4uD79ajgVi zybd33XNj{j8h%fF6Sk6Q{K_&@gqd48A)^EOyKwa&MmHExIru!rGH^m#xQsz_7t2?Mnj${fzPTl~k8$0ysp$FY1vOlLJp^tE#EI41tF^@uzQrW;bB!JlK^4tLB(w-P@7q}<% zJRIG8Z4C!Ra->omeX-p4t zbu!f^cFMVCFtZdKf`DqJ@t?qLo0OSZWa^${a9#IWrP4-*bis)an(k-XQ$)HMQ9F0R z?QL0dV()3+ln?(^?O2!EuENeTqgWv?HssUYW6nqWEr5^F#N=*SIiSUC_*7dK2j>-c za(P%r@X%{O7(9Sc+8kN3lleeQ+3MX+N02tvs1qp9TAGcKUPr|k37Jq?b&$8#v9;YI zIaxP`z|z(cOtCkK-X(<*6Jr|olz)st5IOQ<#N$QDpqMg(>;f`#ce#$u85g;wrG zEt~)P&55w%GY3z0rpyMiG@`YvR(f*}UdW2WBy8ZUjn-5DgIyFv00pi%NfxI1pUq>e#IcU}A>bO`Z28W=mQ-5I_hzu9%BkmbD#uj@JF5W}epgFGW0CQj5gr*M}i$?b(5k!6=g7YVY!tNFymL*HD2I=lgxt&i?W9gh W-sLH5;qL) -> 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,