fix: add clearing interrupts

This commit is contained in:
doryan 2025-05-15 10:23:43 +04:00
parent 64a6532c94
commit 93ade5bda0

View File

@ -157,7 +157,8 @@ impl<const L: usize> UsbBus for UsbDevice<L> {
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<const L: usize> UsbBus for UsbDevice<L> {
}
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<const L: usize> UsbBus for UsbDevice<L> {
// 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<const L: usize> UsbBus for UsbDevice<L> {
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<const L: usize> UsbBus for UsbDevice<L> {
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<const L: usize> UsbBus for UsbDevice<L> {
}
const RESTRICT_RW_FLAG: u8 = !(1 << 5);
const USBINT_CLEAR: u8 = !(1 << 0);
const UDINT_CLEAR: u8 = !(1 << 1 | 1 << 7);