From f7c4b48b85914a94846bcddda7fb929ee0fd55c7 Mon Sep 17 00:00:00 2001 From: doryan Date: Mon, 5 May 2025 23:09:42 +0400 Subject: [PATCH] remove free-interrupt context for endpoint allocator --- src/lib.rs | 97 ++++++++++++++++++++++++++---------------------------- 1 file changed, 47 insertions(+), 50 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 64604a0..5b4c157 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -24,60 +24,57 @@ impl UsbBus for UsbDevice { _interval: u8, ) -> UsbResult { // Handle first endpoint. // - free(|_cs| { - if ep_addr == Some(EndpointAddress::from_parts(0, UsbDirection::In)) { - Ok(ep_addr.unwrap()) - } else { - let address = match ep_addr { - // If current endpoint doesn't allocated, assign ep_addr to variable. // - Some(addr) if !self.ep_table[addr.index()].is_allocated => addr, + if ep_addr == Some(EndpointAddress::from_parts(0, UsbDirection::In)) { + Ok(ep_addr.unwrap()) + } else { + let address = match ep_addr { + // If current endpoint doesn't allocated, assign ep_addr to variable. // + Some(addr) if !self.ep_table[addr.index()].is_allocated => addr, - // If ep_aadr not provided, or current endpoint is allocated, try to find next free endpoint, otherwise return UsbError. // - _ => { - let index = self - .ep_table - .iter() - .enumerate() - .skip(1) - .find(|(index, ep)| { - !ep.is_allocated - && max_packet_size <= ENDPOINTS_ALLOC_LAYOUT[*index] - }) - .ok_or(UsbError::EndpointOverflow)? - .0; + // If ep_aadr not provided, or current endpoint is allocated, try to find next free endpoint, otherwise return UsbError. // + _ => { + let index = self + .ep_table + .iter() + .enumerate() + .skip(1) + .find(|(index, ep)| { + !ep.is_allocated && max_packet_size <= ENDPOINTS_ALLOC_LAYOUT[*index] + }) + .ok_or(UsbError::EndpointOverflow)? + .0; - EndpointAddress::from_parts(index, ep_dir) - } - }; - - // Select endpoint info by address index. // - - let target_endpoint = &mut self.ep_table[address.index()]; - - // Get power of two number of endpoint size. // - - let ep_size = max(8, max_packet_size.next_power_of_two()); - - // Endpoint allocation marker. // - - if DPRAM_SIZE - self.dpram_already_used < ep_size { - Err(UsbError::EndpointMemoryOverflow) - } else { - // Set endpoint parameters. // - - target_endpoint.set_dir(ep_dir); - target_endpoint.set_type(ep_type); - target_endpoint.set_size(ep_size)?; - - // Add used dpram memory. // - - target_endpoint.is_allocated = true; - self.dpram_already_used += ep_size; - - Ok(address) + EndpointAddress::from_parts(index, ep_dir) } + }; + + // Select endpoint info by address index. // + + let target_endpoint = &mut self.ep_table[address.index()]; + + // Get power of two number of endpoint size. // + + let ep_size = max(8, max_packet_size.next_power_of_two()); + + // Endpoint allocation marker. // + + if DPRAM_SIZE - self.dpram_already_used < ep_size { + Err(UsbError::EndpointMemoryOverflow) + } else { + // Set endpoint parameters. // + + target_endpoint.set_dir(ep_dir); + target_endpoint.set_type(ep_type); + target_endpoint.set_size(ep_size)?; + + // Add used dpram memory. // + + target_endpoint.is_allocated = true; + self.dpram_already_used += ep_size; + + Ok(address) } - }) + } } fn enable(&mut self) {