use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum TiDir {
Out,
In,
Inout,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TiIr {
#[serde(default = "default_version")]
pub version: String,
pub chip: TiChip,
pub board: TiBoard,
pub clocks: TiClocksConfig,
pub pins: Vec<TiPinAssignment>,
#[serde(default)]
pub metadata: IndexMap<String, String>,
}
fn default_version() -> String {
"0.1".to_string()
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TiChip {
pub name: String,
pub arch: String,
pub package: String,
pub pac_crate: String,
#[serde(default)]
pub pac_crate_version: Option<String>,
#[serde(default)]
pub target_triple: Option<String>,
pub memory: Vec<TiMemoryRegion>,
pub clock_tree: TiClockTree,
#[serde(default)]
pub prcm: IndexMap<String, TiPrcmGate>,
pub peripherals: IndexMap<String, TiPeripheral>,
pub io_mux: Vec<TiIoMuxPin>,
#[serde(default)]
pub gpio_matrix: Vec<TiGpioMatrixSignal>,
#[serde(default)]
pub linker: Option<TiLinker>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TiLinker {
pub region_text: String,
pub region_data: String,
#[serde(default)]
pub ccfg_origin: Option<u32>,
#[serde(default)]
pub ccfg_length: Option<u32>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TiMemoryRegion {
pub name: String,
pub base: u32,
pub size: u32,
pub access: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TiClockTree {
#[serde(default)]
pub xtal_hi_hz: u32,
#[serde(default = "default_xtal_lo_hz")]
pub xtal_lo_hz: u32,
pub cpu_hz: u32,
pub apb_hz: u32,
#[serde(default)]
pub sclk_hf_src: Vec<String>,
#[serde(default)]
pub sclk_lf_src: Vec<String>,
}
fn default_xtal_lo_hz() -> u32 {
32_768
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TiPrcmGate {
pub clk_en_reg: String,
pub clk_en_field: String,
#[serde(default)]
pub clk_en_variant: Option<String>,
pub rst_reg: String,
pub rst_field: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TiPeripheral {
pub class: String,
pub instance: String,
pub base: u32,
#[serde(default)]
pub irq: Option<u8>,
#[serde(default)]
pub signals: Vec<TiPeripheralSignal>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TiPeripheralSignal {
pub role: String,
pub direction: TiDir,
#[serde(default)]
pub ioc_signal: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TiIoMuxPin {
pub dio: u8,
#[serde(default)]
pub pin: Option<u8>,
#[serde(default)]
pub high_drive: bool,
#[serde(default)]
pub analog_capable: bool,
#[serde(default)]
pub jtag_alt: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TiGpioMatrixSignal {
pub id: u16,
pub name: String,
pub direction: TiDir,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TiBoard {
pub name: String,
pub chip: String,
#[serde(default)]
pub module: Option<String>,
#[serde(default)]
pub flash_mb: u32,
#[serde(default)]
pub pins: Vec<TiPinAssignment>,
#[serde(default)]
pub features: IndexMap<String, String>,
#[serde(default)]
pub console: Option<TiConsoleConfig>,
#[serde(default)]
pub i2c_configs: IndexMap<String, TiI2cConfig>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TiPinAssignment {
pub dio: u8,
pub signal: String,
#[serde(default)]
pub label: Option<String>,
#[serde(default)]
pub peripheral: Option<String>,
pub direction: TiDir,
#[serde(default)]
pub pull: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TiConsoleConfig {
pub peripheral: String,
pub baud: u32,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TiI2cConfig {
pub scl_hz: u32,
}
impl Default for TiI2cConfig {
fn default() -> Self {
Self { scl_hz: 100_000 }
}
}
#[derive(Clone, Debug, Serialize, Deserialize, Default)]
pub struct TiClocksConfig {
pub cpu_hz: u32,
pub apb_hz: u32,
pub xtal_hz: u32,
pub xtal_hi_hz: u32,
pub xtal_lo_hz: u32,
#[serde(default)]
pub kernels: IndexMap<String, String>,
}