5 extern crate feather_m0 as hal;
6 extern crate panic_halt;
7 extern crate usb_device;
8 extern crate usbd_serial;
10 use hal::clock::GenericClockController;
12 use hal::pac::{interrupt, CorePeripherals, Peripherals};
16 use usb_device::bus::UsbBusAllocator;
18 use usb_device::prelude::*;
19 use usbd_serial::{SerialPort, USB_CLASS_CDC};
21 use cortex_m::asm::delay as cycle_delay;
22 use cortex_m::peripheral::NVIC;
26 let mut peripherals = Peripherals::take().unwrap();
27 let mut core = CorePeripherals::take().unwrap();
28 let mut clocks = GenericClockController::with_internal_32kosc(
31 &mut peripherals.SYSCTRL,
32 &mut peripherals.NVMCTRL,
34 let mut pins = hal::Pins::new(peripherals.PORT);
35 let mut red_led = pins.d13.into_open_drain_output(&mut pins.port);
37 let bus_allocator = unsafe {
38 USB_ALLOCATOR = Some(hal::usb_allocator(
46 USB_ALLOCATOR.as_ref().unwrap()
50 USB_SERIAL = Some(SerialPort::new(&bus_allocator));
52 UsbDeviceBuilder::new(&bus_allocator, UsbVidPid(0x16c0, 0x27dd))
53 .manufacturer("Fake company")
54 .product("Serial port")
55 .serial_number("TEST")
56 .device_class(USB_CLASS_CDC)
62 core.NVIC.set_priority(interrupt::USB, 1);
63 NVIC::unmask(interrupt::USB);
66 // Flash the LED in a spin loop to demonstrate that USB is
67 // entirely interrupt driven.
69 cycle_delay(15 * 1024 * 1024);
74 static mut USB_ALLOCATOR: Option<UsbBusAllocator<UsbBus>> = None;
75 static mut USB_BUS: Option<UsbDevice<UsbBus>> = None;
76 static mut USB_SERIAL: Option<SerialPort<UsbBus>> = None;
80 USB_BUS.as_mut().map(|usb_dev| {
81 USB_SERIAL.as_mut().map(|serial| {
82 usb_dev.poll(&mut [serial]);
83 let mut buf = [0u8; 64];
85 if let Ok(count) = serial.read(&mut buf) {
86 for (i, c) in buf.iter().enumerate() {
90 serial.write(&[c.clone()]);