aboutsummaryrefslogtreecommitdiff
path: root/embassy-usb/src/builder.rs
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2022-04-16 04:47:27 +0200
committerDario Nieuwenhuis <[email protected]>2022-04-23 01:11:10 +0200
commit092c2b7dfea146681cea01fd4e4105c21c62b61f (patch)
treebe32635e53177b36ef36939bcdd5eadcf3be3ab8 /embassy-usb/src/builder.rs
parentea0a701ebd142ea42e05e51e844bd53cc9bdf354 (diff)
usb: builtin handling of interface alternate settings
The stack reads its own descriptors to figure out which endpoints are used in which alt settings, and enables/disables them as needed. The ControlHandler has a callback so it can get notified of alternate setting changes, which is purely informative (it doesn't have to do anything).
Diffstat (limited to 'embassy-usb/src/builder.rs')
-rw-r--r--embassy-usb/src/builder.rs23
1 files changed, 13 insertions, 10 deletions
diff --git a/embassy-usb/src/builder.rs b/embassy-usb/src/builder.rs
index 7e67b4ae6..c0aea9838 100644
--- a/embassy-usb/src/builder.rs
+++ b/embassy-usb/src/builder.rs
@@ -1,5 +1,7 @@
1use heapless::Vec; 1use heapless::Vec;
2 2
3use crate::Interface;
4
3use super::control::ControlHandler; 5use super::control::ControlHandler;
4use super::descriptor::{BosWriter, DescriptorWriter}; 6use super::descriptor::{BosWriter, DescriptorWriter};
5use super::driver::{Driver, Endpoint}; 7use super::driver::{Driver, Endpoint};
@@ -121,11 +123,10 @@ impl<'a> Config<'a> {
121pub struct Builder<'d, D: Driver<'d>> { 123pub struct Builder<'d, D: Driver<'d>> {
122 config: Config<'d>, 124 config: Config<'d>,
123 handler: Option<&'d dyn DeviceStateHandler>, 125 handler: Option<&'d dyn DeviceStateHandler>,
124 interfaces: Vec<(u8, &'d mut dyn ControlHandler), MAX_INTERFACE_COUNT>, 126 interfaces: Vec<Interface<'d>, MAX_INTERFACE_COUNT>,
125 control_buf: &'d mut [u8], 127 control_buf: &'d mut [u8],
126 128
127 driver: D, 129 driver: D,
128 next_interface_number: u8,
129 next_string_index: u8, 130 next_string_index: u8,
130 131
131 device_descriptor: DescriptorWriter<'d>, 132 device_descriptor: DescriptorWriter<'d>,
@@ -180,7 +181,6 @@ impl<'d, D: Driver<'d>> Builder<'d, D> {
180 config, 181 config,
181 interfaces: Vec::new(), 182 interfaces: Vec::new(),
182 control_buf, 183 control_buf,
183 next_interface_number: 0,
184 next_string_index: 4, 184 next_string_index: 4,
185 185
186 device_descriptor, 186 device_descriptor,
@@ -234,7 +234,7 @@ impl<'d, D: Driver<'d>> Builder<'d, D> {
234 ) -> FunctionBuilder<'_, 'd, D> { 234 ) -> FunctionBuilder<'_, 'd, D> {
235 let iface_count_index = if self.config.composite_with_iads { 235 let iface_count_index = if self.config.composite_with_iads {
236 self.config_descriptor.iad( 236 self.config_descriptor.iad(
237 InterfaceNumber::new(self.next_interface_number), 237 InterfaceNumber::new(self.interfaces.len() as _),
238 0, 238 0,
239 class, 239 class,
240 subclass, 240 subclass,
@@ -275,13 +275,15 @@ impl<'a, 'd, D: Driver<'d>> FunctionBuilder<'a, 'd, D> {
275 self.builder.config_descriptor.buf[i] += 1; 275 self.builder.config_descriptor.buf[i] += 1;
276 } 276 }
277 277
278 let number = self.builder.next_interface_number; 278 let number = self.builder.interfaces.len() as _;
279 self.builder.next_interface_number += 1; 279 let iface = Interface {
280 handler,
281 current_alt_setting: 0,
282 num_alt_settings: 0,
283 };
280 284
281 if let Some(handler) = handler { 285 if self.builder.interfaces.push(iface).is_err() {
282 if self.builder.interfaces.push((number, handler)).is_err() { 286 panic!("max interface count reached")
283 panic!("max interface count reached")
284 }
285 } 287 }
286 288
287 InterfaceBuilder { 289 InterfaceBuilder {
@@ -318,6 +320,7 @@ impl<'a, 'd, D: Driver<'d>> InterfaceBuilder<'a, 'd, D> {
318 ) -> InterfaceAltBuilder<'_, 'd, D> { 320 ) -> InterfaceAltBuilder<'_, 'd, D> {
319 let number = self.next_alt_setting_number; 321 let number = self.next_alt_setting_number;
320 self.next_alt_setting_number += 1; 322 self.next_alt_setting_number += 1;
323 self.builder.interfaces[self.interface_number.0 as usize].num_alt_settings += 1;
321 324
322 self.builder.config_descriptor.interface_alt( 325 self.builder.config_descriptor.interface_alt(
323 self.interface_number, 326 self.interface_number,