use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum EspDir {
Out,
In,
Inout,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EspIr {
#[serde(default = "default_version")]
pub version: String,
pub chip: EspChip,
pub board: EspBoard,
pub clocks: EspClocksConfig,
pub pins: Vec<EspPinAssignment>,
#[serde(default)]
pub metadata: IndexMap<String, String>,
}
fn default_version() -> String {
"0.1".to_string()
}
fn default_pac_vintage() -> String {
"legacy".to_string()
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EspChip {
pub name: String,
pub arch: String,
pub package: String,
pub pac_crate: String,
#[serde(default = "default_pac_vintage")]
pub pac_vintage: String,
pub gpio_count: u8,
pub memory: Vec<EspMemoryRegion>,
pub clock_tree: EspClockTree,
pub peripherals: IndexMap<String, EspPeripheral>,
pub io_mux: Vec<EspIoMuxPin>,
pub gpio_matrix: Vec<EspGpioMatrixSignal>,
#[serde(default)]
pub linker: Option<EspLinker>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EspLinker {
pub region_text: String,
pub region_data: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EspMemoryRegion {
pub name: String,
pub base: u32,
pub size: u32,
pub access: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EspClockTree {
pub xtal_hz: u32,
pub pll_freqs_hz: Vec<u32>,
pub cpu_freqs_hz: Vec<u32>,
pub apb_hz: u32,
pub rtc_fast_src: Vec<String>,
pub rtc_slow_src: Vec<String>,
pub system_gates: IndexMap<String, EspSystemGate>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EspSystemGate {
pub clk_en_reg: String,
pub clk_en_field: String,
pub rst_reg: String,
pub rst_field: String,
#[serde(default)]
pub clk_sel_reg: Option<String>,
#[serde(default)]
pub clk_sel_field: Option<String>,
#[serde(default)]
pub clk_sel_width: Option<u8>,
#[serde(default)]
pub clk_sel_value: Option<u8>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EspPeripheral {
pub class: String,
pub instance: String,
pub base: u32,
#[serde(default)]
pub irq: Option<u8>,
#[serde(default)]
pub signals: Vec<EspPeripheralSignal>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EspPeripheralSignal {
pub role: String,
pub direction: EspDir,
#[serde(default)]
pub gpio_matrix_id: Option<u16>,
#[serde(default)]
pub iomux_pin: Option<u8>,
#[serde(default)]
pub iomux_fn: Option<u8>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EspIoMuxPin {
pub gpio: u8,
pub pad_name: String,
#[serde(default)]
pub fn0: Option<String>,
#[serde(default)]
pub fn1: Option<String>,
#[serde(default)]
pub fn2: Option<String>,
#[serde(default)]
pub fn3: Option<String>,
#[serde(default)]
pub fn4: Option<String>,
#[serde(default)]
pub fn5: Option<String>,
#[serde(default)]
pub rtc_fn: Option<String>,
#[serde(default)]
pub analog: Option<String>,
#[serde(default)]
pub strap: bool,
#[serde(default)]
pub flash_reserved: bool,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EspGpioMatrixSignal {
pub id: u16,
pub name: String,
pub direction: EspDir,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EspBoard {
pub name: String,
pub chip: String,
#[serde(default)]
pub module: Option<String>,
pub flash_mb: u32,
#[serde(default)]
pub psram_mb: Option<u32>,
pub pins: Vec<EspPinAssignment>,
#[serde(default)]
pub features: IndexMap<String, String>,
#[serde(default)]
pub console: Option<EspConsoleConfig>,
#[serde(default)]
pub i2c_configs: IndexMap<String, EspI2cConfig>,
#[serde(default)]
pub spi_configs: IndexMap<String, EspSpiConfig>,
#[serde(default)]
pub ledc_configs: IndexMap<String, EspLedcConfig>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EspPinAssignment {
pub gpio: u8,
pub signal: String,
#[serde(default)]
pub label: Option<String>,
#[serde(default)]
pub peripheral: Option<String>,
pub direction: EspDir,
#[serde(default)]
pub pull: Option<String>,
#[serde(default)]
pub drive: Option<u8>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EspConsoleConfig {
pub peripheral: String,
pub baud: u32,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EspI2cConfig {
pub scl_hz: u32,
}
impl Default for EspI2cConfig {
fn default() -> Self {
Self { scl_hz: 100_000 }
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EspSpiConfig {
#[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 EspSpiConfig {
fn default() -> Self {
Self {
clk_hz: 1_000_000,
mode: 0,
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EspLedcConfig {
#[serde(default = "default_ledc_freq_hz")]
pub freq_hz: u32,
#[serde(default = "default_ledc_duty_bits")]
pub duty_bits: u8,
}
fn default_ledc_freq_hz() -> u32 {
5_000
}
fn default_ledc_duty_bits() -> u8 {
13
}
impl Default for EspLedcConfig {
fn default() -> Self {
Self {
freq_hz: 5_000,
duty_bits: 13,
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize, Default)]
pub struct EspClocksConfig {
pub cpu_hz: u32,
pub apb_hz: u32,
pub xtal_hz: u32,
pub pll_hz: u32,
#[serde(default)]
pub kernels: IndexMap<String, String>,
}