embassy_stm32_plus/builder/usb/
otg.rs1use 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
15pub struct UsbBuilder {
17 pub usb: USB_OTG_FS,
19 pub dp: PA12,
21 pub dm: PA11,
23 pub config: Option<Config>,
25}
26
27impl UsbBuilder {
29 #[inline]
31 pub fn new(usb: USB_OTG_FS, dp: PA12, dm: PA11) -> Self {
32 Self { usb, dp, dm, config: None }
33 }
34
35 #[inline]
37 pub fn config(mut self, config: Config) -> Self {
38 self.config = Some(config);
39 self
40 }
41
42 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 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 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}