#![no_std] #![no_main] use arduino_mkrzero as bsp; use bsp::hal; #[cfg(not(feature = "use_semihosting"))] use panic_halt as _; #[cfg(feature = "use_semihosting")] use panic_semihosting as _; use bsp::entry; use hal::clock::GenericClockController; use hal::delay::Delay; use hal::pac::{interrupt, CorePeripherals, Peripherals}; use hal::prelude::*; use hal::usb::UsbBus; use usb_device::bus::UsbBusAllocator; use usb_device::prelude::*; use usbd_serial::{SerialPort, USB_CLASS_CDC}; use cortex_m::peripheral::NVIC; static mut USB_ALLOCATOR: Option> = None; static mut USB_BUS: Option> = None; static mut USB_SERIAL: Option> = None; #[entry] fn main() -> ! { let mut peripherals = Peripherals::take().unwrap(); let mut core = CorePeripherals::take().unwrap(); let mut clocks = GenericClockController::with_external_32kosc( peripherals.GCLK, &mut peripherals.PM, &mut peripherals.SYSCTRL, &mut peripherals.NVMCTRL, ); let pins = bsp::pins::Pins::new(peripherals.PORT); let mut led = bsp::pin_alias!(pins.led).into_push_pull_output(); let mut delay = Delay::new(core.SYST, &mut clocks); let usb_n = bsp::pin_alias!(pins.usb_n); let usb_p = bsp::pin_alias!(pins.usb_p); let bus_allocator = unsafe { USB_ALLOCATOR = Some(bsp::usb::usb_allocator( peripherals.USB, &mut clocks, &mut peripherals.PM, usb_n.into(), usb_p.into(), )); USB_ALLOCATOR.as_ref().unwrap() }; unsafe { USB_SERIAL = Some(SerialPort::new(bus_allocator)); USB_BUS = Some( UsbDeviceBuilder::new(bus_allocator, UsbVidPid(0x2222, 0x3333)) .manufacturer("Fake company") .product("Serial port") .serial_number("TEST") .device_class(USB_CLASS_CDC) .build(), ); } unsafe { core.NVIC.set_priority(interrupt::USB, 1); NVIC::unmask(interrupt::USB); } loop { delay.delay_ms(200u8); led.set_high().unwrap(); delay.delay_ms(200u8); led.set_low().unwrap(); // Turn off interrupts so we don't fight with the interrupt cortex_m::interrupt::free(|_| unsafe { if let Some(serial) = USB_SERIAL.as_mut() { let _ = serial.write("log line\r\n".as_bytes()); } }); } } fn poll_usb() { unsafe { if let Some(usb_dev) = USB_BUS.as_mut() { if let Some(serial) = USB_SERIAL.as_mut() { usb_dev.poll(&mut [serial]); // Make the other side happy let mut buf = [0u8; 16]; let _ = serial.read(&mut buf); } } }; } #[interrupt] fn USB() { poll_usb(); }