Move pin isolation config to make_pio_pin

This commit is contained in:
Caleb Jamison 2024-09-16 12:47:07 -04:00
parent 48fd0550d1
commit 9cfde66446

View File

@ -655,10 +655,6 @@ impl<'d, PIO: Instance> Config<'d, PIO> {
/// Set pin used to signal jump. /// Set pin used to signal jump.
pub fn set_jmp_pin(&mut self, pin: &Pin<'d, PIO>) { pub fn set_jmp_pin(&mut self, pin: &Pin<'d, PIO>) {
#[cfg(feature = "_rp235x")]
pin.pin.pad_ctrl().modify(|w| {
w.set_iso(false);
});
self.exec.jmp_pin = pin.pin(); self.exec.jmp_pin = pin.pin();
} }
@ -668,12 +664,6 @@ impl<'d, PIO: Instance> Config<'d, PIO> {
pub fn set_set_pins(&mut self, pins: &[&Pin<'d, PIO>]) { pub fn set_set_pins(&mut self, pins: &[&Pin<'d, PIO>]) {
assert!(pins.len() <= 5); assert!(pins.len() <= 5);
assert_consecutive(pins); assert_consecutive(pins);
#[cfg(feature = "_rp235x")]
for pin in pins {
pin.pin.pad_ctrl().modify(|w| {
w.set_iso(false);
})
}
self.pins.set_base = pins.first().map_or(0, |p| p.pin()); self.pins.set_base = pins.first().map_or(0, |p| p.pin());
self.pins.set_count = pins.len() as u8; self.pins.set_count = pins.len() as u8;
} }
@ -683,12 +673,6 @@ impl<'d, PIO: Instance> Config<'d, PIO> {
/// effective. /// effective.
pub fn set_out_pins(&mut self, pins: &[&Pin<'d, PIO>]) { pub fn set_out_pins(&mut self, pins: &[&Pin<'d, PIO>]) {
assert_consecutive(pins); assert_consecutive(pins);
#[cfg(feature = "_rp235x")]
for pin in pins {
pin.pin.pad_ctrl().modify(|w| {
w.set_iso(false);
})
}
self.pins.out_base = pins.first().map_or(0, |p| p.pin()); self.pins.out_base = pins.first().map_or(0, |p| p.pin());
self.pins.out_count = pins.len() as u8; self.pins.out_count = pins.len() as u8;
} }
@ -698,12 +682,6 @@ impl<'d, PIO: Instance> Config<'d, PIO> {
/// effective. /// effective.
pub fn set_in_pins(&mut self, pins: &[&Pin<'d, PIO>]) { pub fn set_in_pins(&mut self, pins: &[&Pin<'d, PIO>]) {
assert_consecutive(pins); assert_consecutive(pins);
#[cfg(feature = "_rp235x")]
for pin in pins {
pin.pin.pad_ctrl().modify(|w| {
w.set_iso(false);
})
}
self.pins.in_base = pins.first().map_or(0, |p| p.pin()); self.pins.in_base = pins.first().map_or(0, |p| p.pin());
self.in_count = pins.len() as u8; self.in_count = pins.len() as u8;
} }
@ -778,10 +756,7 @@ impl<'d, PIO: Instance + 'd, const SM: usize> StateMachine<'d, PIO, SM> {
config.pins.set_base + config.pins.set_count, config.pins.set_base + config.pins.set_count,
config.pins.out_base, config.pins.out_base,
config.pins.out_base + config.pins.out_count, config.pins.out_base + config.pins.out_count,
] ] {
.iter()
.flatten()
{
low_ok &= pin < 32; low_ok &= pin < 32;
high_ok &= pin >= 16; high_ok &= pin >= 16;
} }
@ -1080,6 +1055,10 @@ impl<'d, PIO: Instance> Common<'d, PIO> {
pub fn make_pio_pin(&mut self, pin: impl Peripheral<P = impl PioPin + 'd> + 'd) -> Pin<'d, PIO> { pub fn make_pio_pin(&mut self, pin: impl Peripheral<P = impl PioPin + 'd> + 'd) -> Pin<'d, PIO> {
into_ref!(pin); into_ref!(pin);
pin.gpio().ctrl().write(|w| w.set_funcsel(PIO::FUNCSEL as _)); pin.gpio().ctrl().write(|w| w.set_funcsel(PIO::FUNCSEL as _));
#[cfg(feature = "_rp235x")]
pin.pad_ctrl().modify(|w| {
w.set_iso(false);
});
// we can be relaxed about this because we're &mut here and nothing is cached // we can be relaxed about this because we're &mut here and nothing is cached
PIO::state().used_pins.fetch_or(1 << pin.pin_bank(), Ordering::Relaxed); PIO::state().used_pins.fetch_or(1 << pin.pin_bank(), Ordering::Relaxed);
Pin { Pin {