From 062b8a3450353eb8d45d054dc920d74ffdd81146 Mon Sep 17 00:00:00 2001
From: Benjamin Koch <bbbsnowball@gmail.com>
Date: Sat, 27 May 2023 19:25:15 +0200
Subject: [PATCH] bugfix: enable pullup on UART RX pin

Otherwise, this would be floating when we set the RS485 transceiver
to transmit mode.
---
 firmware/rust1/src/rs485.rs | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/firmware/rust1/src/rs485.rs b/firmware/rust1/src/rs485.rs
index e3cf3dd..93165c6 100644
--- a/firmware/rust1/src/rs485.rs
+++ b/firmware/rust1/src/rs485.rs
@@ -50,6 +50,16 @@ fn pin_io<P: gpio::Pin>(pin: &P) -> pac::io::Gpio {
     block.gpio(pin.pin() as _)
 }
 
+fn pin_pad<P: gpio::Pin>(pin: &P) -> pac::common::Reg<pac::pads::regs::GpioCtrl, pac::common::RW> {
+    use gpio::Bank;
+
+    let block = match pin.bank() {
+        Bank::Bank0 => pac::PADS_BANK0,
+        Bank::Qspi => pac::PADS_QSPI,
+    };
+    block.gpio(pin.pin() as _)
+}
+
 #[allow(dead_code)]
 async fn debug_print_pio_addr(sm: pac::pio::StateMachine) {
     let mut prev = 42u8;
@@ -238,6 +248,9 @@ impl<H: RS485Handler> RS485<H> {
         // (PIO can always read and we don't want to write but embassy_rp cannot know that so it "helpfully" configured the pin for PIO function.)
         unsafe {
             pin_io(&self.rx_pin).ctrl().write(|w| w.set_funcsel(embassy_rp::pac::io::vals::Gpio17ctrlFuncsel::UART0_RX.0));
+
+            // enable pullup to have it not float when we set the transceiver to transmit
+            pin_pad(&self.rx_pin).modify(|w| w.set_pue(true));
         }
 
         info!("Program size for auto-baud: {}, for tx: {}, wait_for_not_idle is at: {}",
-- 
GitLab