From 18a3368565a5ac8ada27a3bd9a2c377f132a7b8e Mon Sep 17 00:00:00 2001 From: doryan Date: Fri, 14 Feb 2025 00:08:45 +0400 Subject: [PATCH] feat(interrupt): add interrupt cleaner --- src/types/usb_device.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/types/usb_device.rs b/src/types/usb_device.rs index b31d7cb..de2cef9 100644 --- a/src/types/usb_device.rs +++ b/src/types/usb_device.rs @@ -81,6 +81,34 @@ pub(crate) const DPRAM_SIZE: u16 = 832; pub(crate) const ENDPOINTS_ALLOC_LAYOUT: [u16; MAX_ENDPOINTS] = [64, 256, 64, 64, 64, 64, 64]; pub(crate) const ONE_MS_16_MGHZ: u32 = 16000; +const UDINT_BYTE: u8 = 0x7d; +const USBINT_BYTE: u8 = 0x01; +const UEINTX_BYTE: u8 = 0xdf; +pub(crate) trait InterruptCleaner { + fn clear_interrupts(&mut self) -> &mut Self; +} + +impl InterruptCleaner for UDINTWriter { + #[inline] + fn clear_interrupts(&mut self) -> &mut Self { + unsafe { self.bits(UDINT_BYTE) } + } +} + +impl InterruptCleaner for USBINTWriter { + #[inline] + fn clear_interrupts(&mut self) -> &mut Self { + unsafe { self.bits(USBINT_BYTE) } + } +} + +impl InterruptCleaner for UEINTXWriter { + #[inline] + fn clear_interrupts(&mut self) -> &mut Self { + unsafe { self.bits(UEINTX_BYTE) } + } +} + impl UsbDevice { #[inline] pub(crate) fn get_size(&self, cs: CriticalSection<'_>) -> usize {