use crate::phys::addrs;
use crate::phys::gpio::*;
use crate::phys::*;
pub enum Mode {
Output,
Input,
}
pub enum Power {
High = 0x1,
Low = 0x0,
}
pub enum Alt {
Alt0 = 0x0,
Alt1 = 0x1,
Alt2 = 0x2,
Alt3 = 0x3,
Alt4 = 0x4,
Alt5 = 0x5,
}
#[derive(Clone)]
pub enum PullUpDown {
PullDown100k = 0x00,
PullUp47k = 0x01,
PullUp100k = 0x02,
PullUp22k = 0x03,
}
#[derive(Clone)]
pub enum PinSpeed {
Low50MHz = 0x00,
Medium100MHz = 0x01,
Fast150MHz = 0x02,
Max200MHz = 0x03,
}
#[derive(Clone)]
pub enum PullKeep {
Keeper = 0x00,
Pull = 0x01,
}
#[derive(Clone)]
pub enum DriveStrength {
Disabled = 0x00,
Max = 0x01,
MaxDiv2 = 0x02,
MaxDiv3 = 0x03,
MaxDiv4 = 0x04,
MaxDiv5 = 0x05,
MaxDiv6 = 0x06,
MaxDiv7 = 0x07,
}
#[derive(Clone)]
pub struct PadConfig {
pub hysterisis: bool, pub resistance: PullUpDown, pub pull_keep: PullKeep, pub pull_keep_en: bool, pub open_drain: bool, pub speed: PinSpeed, pub drive_strength: DriveStrength, pub fast_slew_rate: bool, }
const PIN_BITS: [u8; 40] = [
3, 2, 4, 5, 6, 8, 10, 17, 16, 11, 0, 2, 1, 3, 18, 19, 23, 22, 17, 16, 26, 27, 24, 25, 12, 13,
30, 31, 18, 31, 23, 22, 12, 7, 15, 14, 13, 12, 17, 16,
];
const PIN_TO_GPIO_PIN: [Pin; 40] = [
Pin::Gpio6,
Pin::Gpio6,
Pin::Gpio9,
Pin::Gpio9,
Pin::Gpio9,
Pin::Gpio9,
Pin::Gpio7,
Pin::Gpio7,
Pin::Gpio7,
Pin::Gpio7,
Pin::Gpio7,
Pin::Gpio7,
Pin::Gpio7,
Pin::Gpio7,
Pin::Gpio6,
Pin::Gpio6,
Pin::Gpio6,
Pin::Gpio6,
Pin::Gpio6,
Pin::Gpio6,
Pin::Gpio6,
Pin::Gpio6,
Pin::Gpio6,
Pin::Gpio6,
Pin::Gpio6,
Pin::Gpio6,
Pin::Gpio6,
Pin::Gpio6,
Pin::Gpio8,
Pin::Gpio9,
Pin::Gpio8,
Pin::Gpio8,
Pin::Gpio7,
Pin::Gpio9,
Pin::Gpio8,
Pin::Gpio8,
Pin::Gpio8,
Pin::Gpio8,
Pin::Gpio8,
Pin::Gpio8,
];
const PIN_MUX: [u32; 40] = [
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_03,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_02,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_04,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_05,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_06,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_08,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_10,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_01,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_00,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_11,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_00,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_02,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_01,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_03,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_02,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_03,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_07,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_06,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_01,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_00,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_10,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_11,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_08,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_09,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_12,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_13,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_14,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B1_15,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_32,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_31,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_37,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_36,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_12,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_07,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_03,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_02,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_01,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_00,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_05,
addrs::IOMUXC_SW_MUX_CTL_PAD_GPIO_SD_B0_04,
];
pub fn pin_mux_config(pin: usize, alt: Alt) {
let addr = PIN_MUX[pin];
assign(addr, (1 << 4) | alt as u32);
}
pub fn pin_pad_config(pin: usize, config: PadConfig) {
let addr = PIN_MUX[pin] + 0x1F0;
let mut value = 0x0;
value = value | ((0x1 & config.fast_slew_rate as u32) << 0);
value = value | ((config.drive_strength as u32) << 3);
value = value | ((config.speed as u32) << 6);
value = value | ((0x1 & config.open_drain as u32) << 11);
value = value | ((config.pull_keep_en as u32) << 12);
value = value | ((config.pull_keep as u32) << 13);
value = value | ((config.resistance as u32) << 14);
value = value | ((0x1 & config.hysterisis as u32) << 16);
assign(addr, value);
}
pub fn pin_mode(pin: usize, mode: Mode) {
gpio_speed(&PIN_TO_GPIO_PIN[pin], MuxSpeed::Fast);
match mode {
Mode::Output => {
gpio_direction(&PIN_TO_GPIO_PIN[pin], PIN_BITS[pin] as u32, Dir::Output);
}
Mode::Input => {
gpio_direction(&PIN_TO_GPIO_PIN[pin], PIN_BITS[pin] as u32, Dir::Input);
}
}
}
pub fn pin_out(pin: usize, power: Power) {
let mask = 0x1 << PIN_BITS[pin];
match power {
Power::High => {
gpio_set(&PIN_TO_GPIO_PIN[pin], mask);
}
Power::Low => {
gpio_clear(&PIN_TO_GPIO_PIN[pin], mask);
}
}
}
pub fn pin_read(pin: usize) -> u32 {
let mask = 0x1 << PIN_BITS[pin];
return gpio_read(&PIN_TO_GPIO_PIN[pin], mask);
}