From 39d3c8d9328da832f1348f1e14adea18c049cbad Mon Sep 17 00:00:00 2001 From: Jonathan BAUDIN Date: Mon, 11 Dec 2023 08:55:49 +0100 Subject: [PATCH] Add free function --- rp2040-hal/src/usb.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/rp2040-hal/src/usb.rs b/rp2040-hal/src/usb.rs index 3a693eaa4..d0dcbb8fa 100644 --- a/rp2040-hal/src/usb.rs +++ b/rp2040-hal/src/usb.rs @@ -172,11 +172,12 @@ struct Inner { out_endpoints: [Option; 16], next_offset: u16, read_setup: bool, + pll: UsbClock, #[cfg(feature = "rp2040-e5")] errata5_state: Option, } impl Inner { - fn new(ctrl_reg: USBCTRL_REGS, ctrl_dpram: USBCTRL_DPRAM) -> Self { + fn new(ctrl_reg: USBCTRL_REGS, ctrl_dpram: USBCTRL_DPRAM, pll: UsbClock) -> Self { Self { ctrl_reg, ctrl_dpram, @@ -184,6 +185,7 @@ impl Inner { out_endpoints: Default::default(), next_offset: 0, read_setup: false, + pll, #[cfg(feature = "rp2040-e5")] errata5_state: None, } @@ -438,7 +440,7 @@ impl UsbBus { pub fn new( ctrl_reg: USBCTRL_REGS, ctrl_dpram: USBCTRL_DPRAM, - _pll: UsbClock, + pll: UsbClock, force_vbus_detect_bit: bool, resets: &mut RESETS, ) -> Self { @@ -476,7 +478,7 @@ impl UsbBus { }); Self { - inner: Mutex::new(RefCell::new(Inner::new(ctrl_reg, ctrl_dpram))), + inner: Mutex::new(RefCell::new(Inner::new(ctrl_reg, ctrl_dpram, pll))), } } @@ -487,6 +489,17 @@ impl UsbBus { inner.ctrl_reg.sie_ctrl.modify(|_, w| w.resume().set_bit()); }); } + + /// Stop and free the Usb resources + pub fn free(self, resets: &mut RESETS) -> (USBCTRL_REGS, USBCTRL_DPRAM, UsbClock) { + critical_section::with(|_cs| { + let inner = self.inner.into_inner().into_inner(); + + inner.ctrl_reg.reset_bring_down(resets); + + (inner.ctrl_reg, inner.ctrl_dpram, inner.pll) + }) + } } impl UsbBusTrait for UsbBus {