#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Peripheral {
Uart0,
Uart1,
Uart2,
I2c0,
I2c1,
Spi0,
Spi1,
Pwm,
Timer,
Lsadc,
Tsensor,
I2s,
Dma,
Sdma,
Sfc,
Trng,
SecurityGroup,
}
impl Peripheral {
pub fn cken_info(&self) -> Option<(u8, u8)> {
match self {
Peripheral::Pwm => Some((0, 2)), Peripheral::I2s => Some((0, 12)), Peripheral::Uart0 => Some((1, 18)), Peripheral::Uart1 => Some((1, 19)),
Peripheral::Uart2 => Some((1, 20)),
Peripheral::Spi0 => Some((1, 25)), Peripheral::I2c0
| Peripheral::I2c1
| Peripheral::Timer
| Peripheral::Lsadc
| Peripheral::Tsensor
| Peripheral::Trng
| Peripheral::SecurityGroup
| Peripheral::Dma
| Peripheral::Sdma
| Peripheral::Sfc
| Peripheral::Spi1 => None,
}
}
}
pub const PERIPHERAL_COUNT: usize = 17;
#[cfg(test)]
mod tests {
use super::*;
use crate::soc::ws63::SYSTEM_CLOCK_HZ;
#[test]
fn test_system_clock_240mhz() {
assert_eq!(SYSTEM_CLOCK_HZ, 240_000_000);
}
#[test]
fn test_peripheral_count() {
assert_eq!(PERIPHERAL_COUNT, 17);
}
#[test]
fn test_peripheral_cken_info_bounds_and_gating() {
let gated = [
Peripheral::Pwm,
Peripheral::I2s,
Peripheral::Uart0,
Peripheral::Uart1,
Peripheral::Uart2,
Peripheral::Spi0,
];
for p in &gated {
let (reg, bit) = p.cken_info().unwrap_or_else(|| panic!("{:?} should be gated", p));
assert!(reg <= 1, "Peripheral {:?} has invalid reg={}", p, reg);
assert!(bit < 32, "Peripheral {:?} has invalid bit={}", p, bit);
}
let ungated = [
Peripheral::I2c0,
Peripheral::I2c1,
Peripheral::Timer,
Peripheral::Lsadc,
Peripheral::Tsensor,
Peripheral::Trng,
Peripheral::SecurityGroup,
Peripheral::Dma,
Peripheral::Sdma,
Peripheral::Sfc,
Peripheral::Spi1,
];
for p in &ungated {
assert_eq!(p.cken_info(), None, "Peripheral {:?} should not be gated", p);
}
}
#[test]
fn test_pwm_cken_info_returns_base_bit() {
assert_eq!(Peripheral::Pwm.cken_info(), Some((0, 2)));
}
#[test]
fn test_i2s_cken_info_is_clk_gate() {
assert_eq!(Peripheral::I2s.cken_info(), Some((0, 12)));
}
#[test]
fn test_peripheral_variants_are_unique() {
let variants: [Peripheral; 17] = [
Peripheral::Uart0,
Peripheral::Uart1,
Peripheral::Uart2,
Peripheral::I2c0,
Peripheral::I2c1,
Peripheral::Spi0,
Peripheral::Spi1,
Peripheral::Pwm,
Peripheral::Timer,
Peripheral::Lsadc,
Peripheral::Tsensor,
Peripheral::I2s,
Peripheral::Dma,
Peripheral::Sdma,
Peripheral::Sfc,
Peripheral::Trng,
Peripheral::SecurityGroup,
];
for i in 0..variants.len() {
for j in (i + 1)..variants.len() {
assert_ne!(variants[i], variants[j]);
}
}
}
}