2020-08-07 11:10:18 +08:00
|
|
|
use libregister::{
|
|
|
|
register, register_at,
|
|
|
|
register_bit, register_bits
|
|
|
|
};
|
2020-08-05 17:35:33 +08:00
|
|
|
|
|
|
|
// With reference to:
|
|
|
|
//
|
|
|
|
// artiq:artiq/gateware/targets/kasli.py:
|
|
|
|
// self.submodules.i2c = gpio.GPIOTristate([i2c.scl, i2c.sda])
|
|
|
|
//
|
|
|
|
// misoc:misoc/cores/gpio.py:
|
|
|
|
// class GPIOTristate(Module, AutoCSR):
|
|
|
|
// def __init__(self, signals, reset_out=0, reset_oe=0):
|
|
|
|
// l = len(signals)
|
|
|
|
// self._in = CSRStatus(l)
|
|
|
|
// self._out = CSRStorage(l, reset=reset_out)
|
|
|
|
// self._oe = CSRStorage(l, reset=reset_oe)
|
|
|
|
//
|
|
|
|
// Hence, using GPIOs as SCL and SDA GPIOs respectively.
|
|
|
|
//
|
|
|
|
// Current compatibility:
|
|
|
|
// zc706: GPIO 50, 51 == SCL, SDA
|
|
|
|
|
2020-08-13 13:39:04 +08:00
|
|
|
pub struct RegisterBlock {
|
2020-08-05 17:35:33 +08:00
|
|
|
pub gpio_output_mask: &'static mut GPIOOutputMask,
|
|
|
|
pub gpio_input: &'static mut GPIOInput,
|
2020-08-07 11:10:18 +08:00
|
|
|
pub gpio_direction: &'static mut GPIODirection,
|
2020-08-05 17:35:33 +08:00
|
|
|
pub gpio_output_enable: &'static mut GPIOOutputEnable,
|
|
|
|
}
|
|
|
|
|
2020-08-13 13:39:04 +08:00
|
|
|
impl RegisterBlock {
|
|
|
|
pub fn i2c() -> Self {
|
2020-08-05 17:35:33 +08:00
|
|
|
Self {
|
|
|
|
gpio_output_mask: GPIOOutputMask::new(),
|
|
|
|
gpio_input: GPIOInput::new(),
|
2020-08-07 11:10:18 +08:00
|
|
|
gpio_direction: GPIODirection::new(),
|
2020-08-05 17:35:33 +08:00
|
|
|
gpio_output_enable: GPIOOutputEnable::new()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// MASK_DATA_1_MSW:
|
|
|
|
// Maskable output data for MIO[53:48]
|
|
|
|
register!(gpio_output_mask, GPIOOutputMask, RW, u32);
|
2020-08-07 11:10:18 +08:00
|
|
|
#[cfg(feature = "target_zc706")]
|
|
|
|
register_at!(GPIOOutputMask, 0xE000A00C, new);
|
2020-08-05 17:35:33 +08:00
|
|
|
// Output for SCL
|
|
|
|
#[cfg(feature = "target_zc706")]
|
|
|
|
register_bit!(gpio_output_mask, scl_o, 2);
|
|
|
|
// Output for SDA
|
|
|
|
#[cfg(feature = "target_zc706")]
|
|
|
|
register_bit!(gpio_output_mask, sda_o, 3);
|
2020-08-07 11:10:18 +08:00
|
|
|
// Mask for keeping bits except SCL and SDA unchanged
|
2020-08-05 17:35:33 +08:00
|
|
|
#[cfg(feature = "target_zc706")]
|
2020-08-07 11:10:18 +08:00
|
|
|
register_bits!(gpio_output_mask, mask, u16, 16, 31);
|
2020-08-05 17:35:33 +08:00
|
|
|
|
|
|
|
// DATA_1_RO:
|
|
|
|
// Input data for MIO[53:32]
|
|
|
|
register!(gpio_input, GPIOInput, RO, u32);
|
2020-08-07 11:10:18 +08:00
|
|
|
#[cfg(feature = "target_zc706")]
|
|
|
|
register_at!(GPIOInput, 0xE000A064, new);
|
2020-08-05 17:35:33 +08:00
|
|
|
// Input for SCL
|
|
|
|
#[cfg(feature = "target_zc706")]
|
2020-08-07 11:10:18 +08:00
|
|
|
register_bit!(gpio_input, scl, 18);
|
2020-08-05 17:35:33 +08:00
|
|
|
// Input for SDA
|
|
|
|
#[cfg(feature = "target_zc706")]
|
2020-08-07 11:10:18 +08:00
|
|
|
register_bit!(gpio_input, sda, 19);
|
|
|
|
|
|
|
|
// DIRM_1:
|
|
|
|
// Direction mode for MIO[53:32]; 0/1 = in/out
|
|
|
|
register!(gpio_direction, GPIODirection, RW, u32);
|
|
|
|
#[cfg(feature = "target_zc706")]
|
|
|
|
register_at!(GPIODirection, 0xE000A244, new);
|
|
|
|
// Direction for SCL
|
|
|
|
#[cfg(feature = "target_zc706")]
|
|
|
|
register_bit!(gpio_direction, scl, 18);
|
|
|
|
// Direction for SDA
|
|
|
|
#[cfg(feature = "target_zc706")]
|
|
|
|
register_bit!(gpio_direction, sda, 19);
|
2020-08-05 17:35:33 +08:00
|
|
|
|
|
|
|
// OEN_1:
|
|
|
|
// Output enable for MIO[53:32]
|
|
|
|
register!(gpio_output_enable, GPIOOutputEnable, RW, u32);
|
2020-08-07 11:10:18 +08:00
|
|
|
#[cfg(feature = "target_zc706")]
|
|
|
|
register_at!(GPIOOutputEnable, 0xE000A248, new);
|
2020-08-05 17:35:33 +08:00
|
|
|
// Output enable for SCL
|
|
|
|
#[cfg(feature = "target_zc706")]
|
2020-08-07 11:10:18 +08:00
|
|
|
register_bit!(gpio_output_enable, scl, 18);
|
2020-08-05 17:35:33 +08:00
|
|
|
// Output enable for SDA
|
|
|
|
#[cfg(feature = "target_zc706")]
|
2020-08-07 11:10:18 +08:00
|
|
|
register_bit!(gpio_output_enable, sda, 19);
|