mod metav1;
pub use metav1::*;
use crate::{FireServeMode, FirmwareConfig};
#[allow(clippy::collapsible_if)]
pub(crate) fn fw_overrides_core(config: &FirmwareConfig) -> [u8; 24] {
let mut out = [PAD_METADATA_BYTE; 24];
let mut offset = 0usize;
let mut override_present = [0u8; 8];
if let Some(ref ice_config) = config.ice {
if ice_config.cpu_freq.is_some() {
override_present[0] |= 1 << 0; }
if ice_config.overclock.is_some() {
override_present[0] |= 1 << 1; }
}
if let Some(ref fire_config) = config.fire {
if fire_config.cpu_freq.is_some() {
override_present[0] |= 1 << 2; }
if fire_config.overclock.is_some() {
override_present[0] |= 1 << 3; }
if fire_config.vreg.is_some() {
override_present[0] |= 1 << 4; }
if fire_config.serve_mode.is_some() {
override_present[0] |= 1 << 7; }
override_present[1] |= 1 << 0;
if fire_config.force_16_bit {
override_present[1] |= 1 << 1; }
}
if config.led.is_some() {
override_present[0] |= 1 << 5; }
if config.swd.is_some() {
override_present[0] |= 1 << 6; }
out[offset..offset + 8].copy_from_slice(&override_present);
offset += 8;
let ice_freq = config
.ice
.as_ref()
.and_then(|c| c.cpu_freq.as_ref())
.map(|f| f.get())
.unwrap_or(0xFFFF);
out[offset..offset + 2].copy_from_slice(&ice_freq.to_le_bytes());
offset += 2;
let fire_freq = config
.fire
.as_ref()
.and_then(|c| c.cpu_freq.as_ref())
.map(|f| f.get())
.unwrap_or(0xFFFF);
out[offset..offset + 2].copy_from_slice(&fire_freq.to_le_bytes());
offset += 2;
out[offset] = config
.fire
.as_ref()
.and_then(|c| c.vreg.as_ref())
.map(|v| v.clone() as u8)
.unwrap_or(0xFF);
offset += 1;
offset += 3;
debug_assert_eq!(offset, 16);
let mut override_value = [0u8; 8];
if let Some(ref ice_config) = config.ice {
if let Some(overclock) = ice_config.overclock {
if overclock {
override_value[0] |= 1 << 0;
}
}
}
if let Some(ref fire_config) = config.fire {
if let Some(overclock) = fire_config.overclock {
if overclock {
override_value[0] |= 1 << 1;
}
}
if let Some(ref serve_mode) = fire_config.serve_mode {
if *serve_mode == FireServeMode::Pio {
override_value[0] |= 1 << 4;
}
}
if fire_config.rom_dma_preload {
override_value[0] |= 1 << 5;
}
if fire_config.force_16_bit {
override_value[0] |= 1 << 6;
}
}
if let Some(ref led) = config.led {
if led.enabled {
override_value[0] |= 1 << 2;
}
}
if let Some(ref swd) = config.swd {
if swd.swd_enabled {
override_value[0] |= 1 << 3;
}
}
out[offset..offset + 8].copy_from_slice(&override_value);
out
}