diff --git a/artiq/firmware/runtime/main.rs b/artiq/firmware/runtime/main.rs index c64d0fc64..91646cc5e 100644 --- a/artiq/firmware/runtime/main.rs +++ b/artiq/firmware/runtime/main.rs @@ -106,9 +106,18 @@ fn startup() { io_expander1 = board_misoc::io_expander::IoExpander::new(1); io_expander0.init().expect("I2C I/O expander #0 initialization failed"); io_expander1.init().expect("I2C I/O expander #1 initialization failed"); + + // Actively drive TX_DISABLE to false on SFP0..3 io_expander0.set_oe(0, 1 << 1).unwrap(); + io_expander0.set_oe(1, 1 << 1).unwrap(); + io_expander1.set_oe(0, 1 << 1).unwrap(); + io_expander1.set_oe(1, 1 << 1).unwrap(); io_expander0.set(0, 1, false); + io_expander0.set(1, 1, false); + io_expander1.set(0, 1, false); + io_expander1.set(1, 1, false); io_expander0.service().unwrap(); + io_expander1.service().unwrap(); } rtio_clocking::init(); diff --git a/artiq/firmware/satman/main.rs b/artiq/firmware/satman/main.rs index e8dfb3584..0b6d1cccb 100644 --- a/artiq/firmware/satman/main.rs +++ b/artiq/firmware/satman/main.rs @@ -475,9 +475,18 @@ pub extern fn main() -> i32 { io_expander1.set(1, 7, true); io_expander1.service().unwrap(); } + + // Actively drive TX_DISABLE to false on SFP0..3 io_expander0.set_oe(0, 1 << 1).unwrap(); + io_expander0.set_oe(1, 1 << 1).unwrap(); + io_expander1.set_oe(0, 1 << 1).unwrap(); + io_expander1.set_oe(1, 1 << 1).unwrap(); io_expander0.set(0, 1, false); + io_expander0.set(1, 1, false); + io_expander1.set(0, 1, false); + io_expander1.set(1, 1, false); io_expander0.service().unwrap(); + io_expander1.service().unwrap(); } #[cfg(has_si5324)]