use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum MicrochipDir {
In,
Out,
Inout,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipIr {
#[serde(default = "default_version")]
pub version: String,
pub chip: MicrochipChip,
pub board: MicrochipBoard,
pub clocks: MicrochipClocksConfig,
pub pins: Vec<MicrochipPinAssignment>,
#[serde(default)]
pub metadata: IndexMap<String, String>,
}
fn default_version() -> String {
"0.1".to_string()
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipChip {
pub name: String,
pub arch: String,
pub package: String,
pub pac_crate: String,
pub pac_version: String,
pub source: MicrochipSource,
pub memory: Vec<MicrochipMemoryRegion>,
pub clock_tree: MicrochipClockTree,
pub peripherals: IndexMap<String, MicrochipPeripheral>,
pub io_mux: Vec<MicrochipIoMuxPad>,
#[serde(default)]
pub linker: Option<MicrochipLinker>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipSource {
pub datasheet: String,
pub revision: String,
#[serde(default)]
pub errata: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipLinker {
pub region_text: String,
pub region_data: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipMemoryRegion {
pub name: String,
pub base: u32,
pub size: u32,
pub access: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipClockTree {
#[serde(default)]
pub xosc_hz: Option<u32>,
#[serde(default)]
pub dfll_target_hz: Option<u32>,
#[serde(default)]
pub dpll_target_hz: Option<u32>,
pub cpu_hz: u32,
pub apba_hz: u32,
pub apbb_hz: u32,
#[serde(default)]
pub apbc_hz: Option<u32>,
#[serde(default)]
pub apbd_hz: Option<u32>,
pub gclk_generators: Vec<MicrochipGclkGenerator>,
pub mclk_gates: IndexMap<String, MicrochipMclkGate>,
pub pchctrl_channels: IndexMap<String, MicrochipPchctrlChannel>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipGclkGenerator {
pub id: u8,
pub source: String,
pub div: u32,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipMclkGate {
pub reg: String,
pub field: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipPchctrlChannel {
pub id: u8,
pub generator: u8,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipPeripheral {
pub class: String,
pub instance: String,
pub base: u32,
#[serde(default)]
pub irq: Option<u16>,
#[serde(default)]
pub mclk_field: Option<String>,
#[serde(default)]
pub gclk_pchctrl_id: Option<u8>,
#[serde(default)]
pub mode: Option<String>,
#[serde(default)]
pub signals: Vec<MicrochipPeripheralSignal>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipPeripheralSignal {
pub role: String,
pub direction: MicrochipDir,
pub pad: String,
pub pmux: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipIoMuxPad {
pub pad: String,
pub group: u8,
pub pin: u8,
#[serde(default)]
pub fn_a: Option<String>,
#[serde(default)]
pub fn_b: Option<String>,
#[serde(default)]
pub fn_c: Option<String>,
#[serde(default)]
pub fn_d: Option<String>,
#[serde(default)]
pub fn_e: Option<String>,
#[serde(default)]
pub fn_f: Option<String>,
#[serde(default)]
pub fn_g: Option<String>,
#[serde(default)]
pub fn_h: Option<String>,
#[serde(default)]
pub fn_n: Option<String>,
#[serde(default)]
pub analog: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipBoard {
pub name: String,
pub chip: String,
pub flash_mb: f32,
pub source: MicrochipBoardSource,
#[serde(default)]
pub console: Option<MicrochipConsoleConfig>,
pub pins: Vec<MicrochipPinAssignment>,
#[serde(default)]
pub i2c_configs: IndexMap<String, MicrochipI2cConfig>,
#[serde(default)]
pub spi_configs: IndexMap<String, MicrochipSpiConfig>,
#[serde(default)]
pub features: IndexMap<String, String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipBoardSource {
pub user_guide: String,
pub revision: String,
#[serde(default)]
pub pinout_sheet: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipPinAssignment {
pub pad: String,
pub signal: String,
#[serde(default)]
pub peripheral: Option<String>,
pub direction: MicrochipDir,
#[serde(default)]
pub label: Option<String>,
#[serde(default)]
pub pull: Option<String>,
#[serde(default)]
pub drive: Option<u8>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipConsoleConfig {
pub peripheral: String,
pub baud: u32,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipI2cConfig {
pub scl_hz: u32,
}
impl Default for MicrochipI2cConfig {
fn default() -> Self {
Self { scl_hz: 100_000 }
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MicrochipSpiConfig {
#[serde(default = "default_spi_clk_hz")]
pub clk_hz: u32,
#[serde(default)]
pub mode: u8,
}
fn default_spi_clk_hz() -> u32 {
1_000_000
}
impl Default for MicrochipSpiConfig {
fn default() -> Self {
Self {
clk_hz: 1_000_000,
mode: 0,
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize, Default)]
pub struct MicrochipClocksConfig {
pub cpu_hz: u32,
pub apba_hz: u32,
pub apbb_hz: u32,
pub apbc_hz: u32,
pub apbd_hz: u32,
pub xosc_hz: u32,
pub dfll_target_hz: u32,
pub dpll_target_hz: u32,
#[serde(default)]
pub kernels: IndexMap<String, u8>,
}