From 93ade5bda079b5a0432491eebc2dd12301c126f2 Mon Sep 17 00:00:00 2001 From: doryan Date: Thu, 15 May 2025 10:23:43 +0400 Subject: [PATCH] fix: add clearing interrupts --- src/lib.rs | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 82469a4..a6b1800 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -157,7 +157,8 @@ impl UsbBus for UsbDevice { let (udint, udien, usbint) = (usb.udint.read(), usb.udien.read(), usb.usbint.read()); if usbint.vbusti().bit_is_set() { - usb.usbint.write(|w| w.vbusti().clear_bit()); + usb.usbint + .write(|w| unsafe { w.bits(USBINT_CLEAR) }.vbusti().clear_bit()); if usb.usbsta.read().vbus().bit_is_set() { return PollResult::Resume; @@ -179,7 +180,8 @@ impl UsbBus for UsbDevice { } if udint.sofi().bit_is_set() { - usb.udint.write(|w| w.sofi().clear_bit()); + usb.udint + .write(|w| unsafe { w.bits(UDINT_CLEAR) }.sofi().clear_bit()); } if usb.usbcon.read().frzclk().bit_is_clear() { @@ -293,8 +295,13 @@ impl UsbBus for UsbDevice { // Clear resume informations. // - usb.udint - .write(|w| w.wakeupi().clear_bit().suspi().clear_bit()); + usb.udint.write(|w| { + unsafe { w.bits(UDINT_CLEAR) } + .wakeupi() + .clear_bit() + .suspi() + .clear_bit() + }); usb.udien .modify(|_, w| w.wakeupe().clear_bit().suspe().set_bit()); @@ -316,8 +323,13 @@ impl UsbBus for UsbDevice { usb.usbcon.modify(|_, w| w.frzclk().clear_bit()); - usb.udint - .write(|w| w.wakeupi().clear_bit().suspi().clear_bit()); + usb.udint.write(|w| { + unsafe { w.bits(UDINT_CLEAR) } + .wakeupi() + .clear_bit() + .suspi() + .clear_bit() + }); usb.udien .modify(|_, w| w.wakeupe().clear_bit().suspe().set_bit()); @@ -355,8 +367,13 @@ impl UsbBus for UsbDevice { free(|cs| { let (usb, pll) = (self.usb.borrow(cs), self.pll.borrow(cs)); - usb.udint - .write(|w| w.wakeupi().clear_bit().suspi().clear_bit()); + usb.udint.write(|w| { + unsafe { w.bits(UDINT_CLEAR) } + .wakeupi() + .clear_bit() + .suspi() + .clear_bit() + }); // Suspend. // @@ -440,3 +457,5 @@ impl UsbBus for UsbDevice { } const RESTRICT_RW_FLAG: u8 = !(1 << 5); +const USBINT_CLEAR: u8 = !(1 << 0); +const UDINT_CLEAR: u8 = !(1 << 1 | 1 << 7);