diff options
| author | Dario Nieuwenhuis <[email protected]> | 2022-04-16 04:47:27 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2022-04-23 01:11:10 +0200 |
| commit | 092c2b7dfea146681cea01fd4e4105c21c62b61f (patch) | |
| tree | be32635e53177b36ef36939bcdd5eadcf3be3ab8 /embassy-usb/src/builder.rs | |
| parent | ea0a701ebd142ea42e05e51e844bd53cc9bdf354 (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.rs | 23 |
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 @@ | |||
| 1 | use heapless::Vec; | 1 | use heapless::Vec; |
| 2 | 2 | ||
| 3 | use crate::Interface; | ||
| 4 | |||
| 3 | use super::control::ControlHandler; | 5 | use super::control::ControlHandler; |
| 4 | use super::descriptor::{BosWriter, DescriptorWriter}; | 6 | use super::descriptor::{BosWriter, DescriptorWriter}; |
| 5 | use super::driver::{Driver, Endpoint}; | 7 | use super::driver::{Driver, Endpoint}; |
| @@ -121,11 +123,10 @@ impl<'a> Config<'a> { | |||
| 121 | pub struct Builder<'d, D: Driver<'d>> { | 123 | pub 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, |
