use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum SilabsDir {
Out,
In,
Inout,
}
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum SilabsRoutingKind {
Routeloc,
GpioMatrix,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SilabsIr {
#[serde(default = "default_version")]
pub version: String,
pub chip: SilabsChip,
pub board: SilabsBoard,
pub clocks: SilabsClocksConfig,
pub pins: Vec<SilabsPinAssignment>,
#[serde(default)]
pub metadata: IndexMap<String, String>,
}
fn default_version() -> String {
"0.1".to_string()
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SilabsChip {
pub name: String,
pub arch: String,
pub package: String,
pub pac_crate: String,
#[serde(default)]
pub pac_sku_module: Option<String>,
pub gpio_count: u16,
pub routing_kind: SilabsRoutingKind,
pub memory: Vec<SilabsMemoryRegion>,
pub clock_tree: SilabsClockTree,
pub peripherals: IndexMap<String, SilabsPeripheral>,
pub gpio: SilabsGpioInventory,
#[serde(default)]
pub linker: Option<SilabsLinker>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SilabsLinker {
pub region_text: String,
pub region_data: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SilabsMemoryRegion {
pub name: String,
pub base: u32,
pub size: u32,
pub access: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SilabsClockTree {
pub hfxo_hz: u32,
pub hfrco_hz: u32,
pub auxhfrco_hz: u32,
pub lfxo_hz: u32,
pub lfrco_hz: u32,
pub ushfrco_hz: u32,
pub hfclk_hz: u32,
pub cpu_hz: u32,
pub system_gates: IndexMap<String, SilabsSystemGate>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SilabsSystemGate {
pub clk_en_reg: String,
pub clk_en_field: String,
#[serde(default)]
pub rst_reg: Option<String>,
#[serde(default)]
pub rst_field: Option<String>,
#[serde(default)]
pub clk_sel_reg: Option<String>,
#[serde(default)]
pub clk_sel_field: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SilabsPeripheral {
pub class: String,
pub instance: String,
pub base: u32,
#[serde(default)]
pub irq: Option<u16>,
#[serde(default)]
pub irq_tx: Option<u16>,
#[serde(default)]
pub irq_odd: Option<u16>,
#[serde(default)]
pub signals: Vec<SilabsPeripheralSignal>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SilabsPeripheralSignal {
pub role: String,
pub direction: SilabsDir,
pub route_reg: String,
pub route_field: String,
pub pen_reg: String,
pub pen_field: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SilabsGpioInventory {
pub ports: Vec<String>,
pub pins_per_port: IndexMap<String, u8>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SilabsBoard {
pub name: String,
pub chip: String,
pub flash_mb: u32,
pub pins: Vec<SilabsPinAssignment>,
#[serde(default)]
pub features: IndexMap<String, serde_yaml::Value>,
#[serde(default)]
pub console: Option<SilabsConsoleConfig>,
#[serde(default)]
pub i2c_configs: IndexMap<String, SilabsI2cConfig>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SilabsPinAssignment {
pub port: String,
pub pin: u8,
pub signal: String,
#[serde(default)]
pub label: Option<String>,
#[serde(default)]
pub peripheral: Option<String>,
pub direction: SilabsDir,
#[serde(default)]
pub pull: Option<String>,
#[serde(default)]
pub initial: Option<String>,
#[serde(default)]
pub routeloc: Option<u8>,
#[serde(default)]
pub alt_function: Option<String>,
#[serde(default)]
pub alt_routeloc: Option<u8>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SilabsConsoleConfig {
pub peripheral: String,
pub baud: u32,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SilabsI2cConfig {
pub scl_hz: u32,
}
impl Default for SilabsI2cConfig {
fn default() -> Self {
Self { scl_hz: 100_000 }
}
}
#[derive(Clone, Debug, Serialize, Deserialize, Default)]
pub struct SilabsClocksConfig {
pub cpu_hz: u32,
pub hfclk_hz: u32,
pub hfxo_hz: u32,
pub lfxo_hz: u32,
pub hfrco_hz: u32,
}