usb: add add_class
to builder, so that FooBarClass::new(&mut builder)
can set up everything.
This commit is contained in:
@ -10,3 +10,4 @@ defmt = { version = "0.3", optional = true }
|
||||
log = { version = "0.4.14", optional = true }
|
||||
cortex-m = "0.7.3"
|
||||
num-traits = { version = "0.2.14", default-features = false }
|
||||
heapless = "0.7.10"
|
@ -1,8 +1,11 @@
|
||||
use heapless::Vec;
|
||||
|
||||
use super::class::UsbClass;
|
||||
use super::descriptor::{BosWriter, DescriptorWriter};
|
||||
use super::driver::{Driver, EndpointAllocError};
|
||||
use super::types::*;
|
||||
use super::UsbDevice;
|
||||
use super::MAX_CLASS_COUNT;
|
||||
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||
@ -116,6 +119,7 @@ impl<'a> Config<'a> {
|
||||
/// Used to build new [`UsbDevice`]s.
|
||||
pub struct UsbDeviceBuilder<'d, D: Driver<'d>> {
|
||||
config: Config<'d>,
|
||||
classes: Vec<&'d mut dyn UsbClass, MAX_CLASS_COUNT>,
|
||||
|
||||
bus: D,
|
||||
next_interface_number: u8,
|
||||
@ -165,6 +169,7 @@ impl<'d, D: Driver<'d>> UsbDeviceBuilder<'d, D> {
|
||||
UsbDeviceBuilder {
|
||||
bus,
|
||||
config,
|
||||
classes: Vec::new(),
|
||||
next_interface_number: 0,
|
||||
next_string_index: 4,
|
||||
|
||||
@ -175,7 +180,7 @@ impl<'d, D: Driver<'d>> UsbDeviceBuilder<'d, D> {
|
||||
}
|
||||
|
||||
/// Creates the [`UsbDevice`] instance with the configuration in this builder.
|
||||
pub fn build(mut self, classes: &'d mut [&'d mut dyn UsbClass]) -> UsbDevice<'d, D> {
|
||||
pub fn build(mut self) -> UsbDevice<'d, D> {
|
||||
self.config_descriptor.end_configuration();
|
||||
self.bos_descriptor.end_bos();
|
||||
|
||||
@ -185,10 +190,16 @@ impl<'d, D: Driver<'d>> UsbDeviceBuilder<'d, D> {
|
||||
self.device_descriptor.into_buf(),
|
||||
self.config_descriptor.into_buf(),
|
||||
self.bos_descriptor.writer.into_buf(),
|
||||
classes,
|
||||
self.classes,
|
||||
)
|
||||
}
|
||||
|
||||
pub fn add_class(&mut self, class: &'d mut dyn UsbClass) {
|
||||
if self.classes.push(class).is_err() {
|
||||
panic!("max class count reached")
|
||||
}
|
||||
}
|
||||
|
||||
/// Allocates a new interface number.
|
||||
pub fn alloc_interface(&mut self) -> InterfaceNumber {
|
||||
let number = self.next_interface_number;
|
||||
|
@ -14,6 +14,7 @@ pub mod types;
|
||||
mod util;
|
||||
|
||||
use class::ControlInRequestStatus;
|
||||
use heapless::Vec;
|
||||
|
||||
use self::class::{RequestStatus, UsbClass};
|
||||
use self::control::*;
|
||||
@ -53,6 +54,8 @@ pub const CONFIGURATION_VALUE: u8 = 1;
|
||||
/// The default value for bAlternateSetting for all interfaces.
|
||||
pub const DEFAULT_ALTERNATE_SETTING: u8 = 0;
|
||||
|
||||
pub const MAX_CLASS_COUNT: usize = 4;
|
||||
|
||||
pub struct UsbDevice<'d, D: Driver<'d>> {
|
||||
bus: D::Bus,
|
||||
control: D::ControlPipe,
|
||||
@ -67,7 +70,7 @@ pub struct UsbDevice<'d, D: Driver<'d>> {
|
||||
self_powered: bool,
|
||||
pending_address: u8,
|
||||
|
||||
classes: &'d mut [&'d mut dyn UsbClass],
|
||||
classes: Vec<&'d mut dyn UsbClass, MAX_CLASS_COUNT>,
|
||||
}
|
||||
|
||||
impl<'d, D: Driver<'d>> UsbDevice<'d, D> {
|
||||
@ -77,7 +80,7 @@ impl<'d, D: Driver<'d>> UsbDevice<'d, D> {
|
||||
device_descriptor: &'d [u8],
|
||||
config_descriptor: &'d [u8],
|
||||
bos_descriptor: &'d [u8],
|
||||
classes: &'d mut [&'d mut dyn UsbClass],
|
||||
classes: Vec<&'d mut dyn UsbClass, MAX_CLASS_COUNT>,
|
||||
) -> Self {
|
||||
let control = driver
|
||||
.alloc_control_pipe(config.max_packet_size_0 as u16)
|
||||
|
Reference in New Issue
Block a user