///! IOU SLCR for MIO pin configuration use volatile_register::{RO, RW, WO}; use libregister::{ register, register_at, register_bit, register_bits, register_bits_typed, RegisterW, RegisterRW, }; #[repr(C)] pub struct RegisterBlock { pub mio_pin: [MioPin; 78], pub bank0_drive0: BankDriveCtrl, pub bank0_drive1: BankDriveCtrl, pub bank0_input_ctrl: BankInputCtrl, pub bank0_pull_ctrl: BankPullCtrl, pub bank0_pull_enable: BankPullEnable, pub bank0_slew_ctrl: BankSlewCtrl, pub bank0_status: BankStatus, pub bank1_drive0: BankDriveCtrl, pub bank1_drive1: BankDriveCtrl, pub bank1_input_ctrl: BankInputCtrl, pub bank1_pull_ctrl: BankPullCtrl, pub bank1_pull_enable: BankPullEnable, pub bank1_slew_ctrl: BankSlewCtrl, pub bank1_status: BankStatus, pub bank2_drive0: BankDriveCtrl, pub bank2_drive1: BankDriveCtrl, pub bank2_input_ctrl: BankInputCtrl, pub bank2_pull_ctrl: BankPullCtrl, pub bank2_pull_enable: BankPullEnable, pub bank2_slew_ctrl: BankSlewCtrl, pub bank2_status: BankStatus, reserved1: [u32; 5], pub mio_loopback: RW, pub mio_mst_tri0: RW, pub mio_mst_tri1: RW, pub mio_mst_tri2: RW, pub wdt_clk_sel: RW, // 0 = internal APB clock, 1 = external pub can_mio_ctrl: RW, pub gem_clk_ctrl: RW, pub sdio_clk_ctrl: RW, pub ctrl_reg_sd: RW, pub sd_itap_dly: RW, pub sd_otap_dly_sel: RW, pub sd_cfg1: RW, pub sd_cfg2: RW, pub sd_cfg3: RW, pub sd_init_preset: RW, pub sd_speed_preset: RW, pub sd_hspeed_preset: RW, pub sd_sdr12_preset: RW, pub sd_sdr25_preset: RW, pub sd_sdr50_preset: RW, reserved2: [u32; 1], pub sd_sdr104_preset: RW, pub sd_ddr50_preset: RW, pub sd_max_cur_18: RW, pub sd_max_cur_30: RW, pub sd_max_cur_33: RW, pub sd_dll_ctrl: RW, pub sd_cdn_ctrl: RW, pub gem_ctrl: RW, reserved3: [u32; 7], pub iou_ttc_apb_clk: RW, reserved4: [u32; 3], pub iou_tapdly_bypass: RW, reserved5: [u32; 3], pub iou_coherent_ctrl: RW, pub video_pss_clk_sel: RW, pub iou_interconnect_route: RW, reserved6: [u32; 125], pub ctrl: RW, reserved7: [u32; 63], pub isr: RW, // todo: WTC LSB pub imr: RO, pub ier: WO, pub idr: WO, pub itr: WO, } register_at!(RegisterBlock, 0xFF18_0000, iou_slcr); register!(mio_pin, MioPin, RW, u32); register_bits!(mio_pin, l3_sel, u8, 5, 7); register_bits!(mio_pin, l2_sel, u8, 3, 4); register_bit!(mio_pin, l1_sel, 2); register_bit!(mio_pin, l0_sel, 1); register!(bank_drive_ctrl, BankDriveCtrl, RW, u32); register_bits!(bank_drive_ctrl, drive, u32, 0, 25); // 0 = CMOS, 1 = Schmitt register!(bank_input_ctrl, BankInputCtrl, RW, u32); register_bits!(bank_input_ctrl, schmitt, u32, 0, 25); // 0 = down, 1 = up register!(bank_pull_ctrl, BankPullCtrl, RW, u32); register_bits!(bank_pull_ctrl, pull_up, u32, 0, 25); register!(bank_pull_enable, BankPullEnable, RW, u32); register_bits!(bank_pull_enable, pull_enable, u32, 0, 25); // 0 = fast, 1 = slow register!(bank_slew_ctrl, BankSlewCtrl, RW, u32); register_bits!(bank_slew_ctrl, slow_slew, u32, 0, 25); // 0 = 2.5 or 3.3V, 1 = 1.8V register!(bank_status, BankStatus, RO, u32); register_bit!(bank_status, voltage_mode, 0); // todo: impl for MioPin (or RegisterBlock?) to make drive ctrl less obnoxious // might as well toss in convenience functions for pull up/down, etc.