embassy_stm32_plus/builder/usb/
otg.rs

1use embassy_stm32::{bind_interrupts, usb};
2use embassy_stm32::peripherals::{PA11, PA12, USB_OTG_FS};
3use embassy_stm32::usb::{Config, Driver};
4use embassy_usb::{Builder, UsbDevice};
5use embassy_usb::class::cdc_acm::CdcAcmClass;
6use embassy_usb::class::cdc_ncm::CdcNcmClass;
7use crate::builder::usb::acm_state::AcmState;
8use crate::builder::usb::buf::UsbBuf;
9use crate::builder::usb::ncm_state::NcmState;
10
11bind_interrupts!(struct Irqs {
12    OTG_FS => usb::InterruptHandler<USB_OTG_FS>;
13});
14
15/// usb builder
16pub struct UsbBuilder {
17    /// usb device
18    pub usb: USB_OTG_FS,
19    /// dp pin
20    pub dp: PA12,
21    /// dm pin
22    pub dm: PA11,
23    /// otg usb config
24    pub config: Option<Config>,
25}
26
27/// custom method
28impl UsbBuilder {
29    /// create builder
30    #[inline]
31    pub fn new(usb: USB_OTG_FS, dp: PA12, dm: PA11) -> Self {
32        Self { usb, dp, dm, config: None }
33    }
34
35    /// set otg usb config
36    #[inline]
37    pub fn config(mut self, config: Config) -> Self {
38        self.config = Some(config);
39        self
40    }
41
42    /// get builder
43    fn builder<'a, const DD: usize, const CD: usize, const BD: usize, const CB: usize>
44    (self, ep_out_buffer: &'a mut [u8], usb_buf: &'a mut UsbBuf<DD, CD, BD, CB>, config: embassy_usb::Config<'a>)
45     -> Builder<'a, Driver<'a, USB_OTG_FS>> {
46        let driver = Driver::new_fs(self.usb, Irqs, self.dp, self.dm, ep_out_buffer, self.config.unwrap_or_default());
47        Builder::new(driver, config, usb_buf.device_descriptor.as_mut(), usb_buf.config_descriptor.as_mut(), usb_buf.bos_descriptor.as_mut(), usb_buf.control_buf.as_mut())
48    }
49
50    /// build cdc acm usb
51    pub fn build_cdc_acm<'a, const DD: usize, const CD: usize, const BD: usize, const CB: usize>
52    (self, config: embassy_usb::Config<'a>, ep_out_buffer: &'a mut [u8], usb_buf: &'a mut UsbBuf<DD, CD, BD, CB>, state: &'a mut AcmState<'a>)
53     -> (CdcAcmClass<'a, Driver<'a, USB_OTG_FS>>, UsbDevice<'a, Driver<'a, USB_OTG_FS>>) {
54        let mut builder = self.builder(ep_out_buffer, usb_buf, config);
55        (CdcAcmClass::new(&mut builder, &mut state.state, state.max_packet_size), builder.build())
56    }
57
58    /// build adc ncm usb
59    pub fn build_cdc_ncm<'a, const DD: usize, const CD: usize, const BD: usize, const CB: usize>
60    (self, config: embassy_usb::Config<'a>, ep_out_buffer: &'a mut [u8], usb_buf: &'a mut UsbBuf<DD, CD, BD, CB>, state: &'a mut NcmState<'a>)
61     -> (CdcNcmClass<'a, Driver<'a, USB_OTG_FS>>, UsbDevice<'a, Driver<'a, USB_OTG_FS>>) {
62        let mut builder = self.builder(ep_out_buffer, usb_buf, config);
63        (CdcNcmClass::new(&mut builder, &mut state.state, state.mac_address, state.max_packet_size), builder.build())
64    }
65}