use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum NrfDir {
Out,
In,
Inout,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct NrfIr {
#[serde(default = "default_version")]
pub version: String,
pub chip: NrfChip,
pub board: NrfBoard,
pub clocks: NrfClocksConfig,
pub pins: Vec<NrfPinAssignment>,
#[serde(default)]
pub metadata: IndexMap<String, String>,
}
fn default_version() -> String {
"0.1".to_string()
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct NrfChip {
pub name: String,
pub arch: String,
pub package: String,
pub pac_crate: String,
pub gpio_ports: Vec<NrfGpioPort>,
pub memory: Vec<NrfMemoryRegion>,
pub clock_tree: NrfClockTree,
#[serde(default)]
pub peripheral_slots: Vec<NrfPeripheralSlot>,
pub peripherals: IndexMap<String, NrfPeripheral>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct NrfGpioPort {
pub port: u8,
pub pin_count: u8,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct NrfMemoryRegion {
pub name: String,
pub base: u32,
pub size: u32,
pub access: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct NrfClockTree {
pub hfclk_hz: u32,
pub lfclk_hz: u32,
pub hfclk_src: Vec<String>,
pub lfclk_src: Vec<String>,
pub pclk16m_hz: u32,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct NrfPeripheralSlot {
pub slot: u8,
pub instances: Vec<String>,
pub base: u32,
pub irq: u8,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct NrfPeripheral {
pub class: String,
pub instance: String,
#[serde(default)]
pub base: u32,
#[serde(default)]
pub irq: Option<u8>,
#[serde(default)]
pub slot: Option<u8>,
#[serde(default)]
pub enable_val: Option<u8>,
#[serde(default)]
pub psel: Vec<NrfPselRole>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct NrfPselRole {
pub role: String,
pub direction: NrfDir,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct NrfBoard {
pub name: String,
pub chip: String,
pub flash_mb: u32,
#[serde(default)]
pub console: Option<NrfConsoleConfig>,
pub pins: Vec<NrfPinAssignment>,
#[serde(default)]
pub features: IndexMap<String, String>,
#[serde(default)]
pub spi_configs: IndexMap<String, NrfSpiConfig>,
#[serde(default)]
pub i2c_configs: IndexMap<String, NrfI2cConfig>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct NrfPinAssignment {
pub port: u8,
pub pin: u8,
pub signal: String,
#[serde(default)]
pub peripheral: Option<String>,
#[serde(default)]
pub role: Option<String>,
pub direction: NrfDir,
#[serde(default)]
pub label: Option<String>,
#[serde(default)]
pub pull: Option<String>,
#[serde(default)]
pub drive: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct NrfConsoleConfig {
pub peripheral: String,
pub baud: u32,
}
#[derive(Clone, Debug, Serialize, Deserialize, Default)]
pub struct NrfClocksConfig {
pub hfclk_hz: u32,
pub lfclk_hz: u32,
pub hfclk_src: String,
pub lfclk_src: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct NrfSpiConfig {
#[serde(default = "default_spi_freq")]
pub frequency: u32,
#[serde(default)]
pub mode: u8,
}
fn default_spi_freq() -> u32 {
4_000_000
}
impl Default for NrfSpiConfig {
fn default() -> Self {
Self {
frequency: 4_000_000,
mode: 0,
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct NrfI2cConfig {
#[serde(default = "default_i2c_freq")]
pub frequency: u32,
}
fn default_i2c_freq() -> u32 {
100_000
}
impl Default for NrfI2cConfig {
fn default() -> Self {
Self { frequency: 100_000 }
}
}