diff options
Diffstat (limited to 'examples/nrf/src/bin')
| -rw-r--r-- | examples/nrf/src/bin/usb_serial.rs | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/examples/nrf/src/bin/usb_serial.rs b/examples/nrf/src/bin/usb_serial.rs index f108db46d..377ae8c3a 100644 --- a/examples/nrf/src/bin/usb_serial.rs +++ b/examples/nrf/src/bin/usb_serial.rs | |||
| @@ -6,28 +6,52 @@ | |||
| 6 | use core::mem; | 6 | use core::mem; |
| 7 | 7 | ||
| 8 | use defmt::{info, panic}; | 8 | use defmt::{info, panic}; |
| 9 | use embassy::channel::signal::Signal; | ||
| 9 | use embassy::executor::Spawner; | 10 | use embassy::executor::Spawner; |
| 11 | use embassy::interrupt::InterruptExt; | ||
| 10 | use embassy_nrf::usb::{Driver, Instance}; | 12 | use embassy_nrf::usb::{Driver, Instance}; |
| 11 | use embassy_nrf::{interrupt, pac, Peripherals}; | 13 | use embassy_nrf::{interrupt, interrupt, pac, pac, Peripherals}; |
| 12 | use embassy_usb::driver::EndpointError; | 14 | use embassy_usb::driver::EndpointError; |
| 15 | use embassy_usb::util::EnabledUsbDevice; | ||
| 13 | use embassy_usb::{Builder, Config}; | 16 | use embassy_usb::{Builder, Config}; |
| 14 | use embassy_usb_serial::{CdcAcmClass, State}; | 17 | use embassy_usb_serial::{CdcAcmClass, State}; |
| 15 | use futures::future::join; | 18 | use futures::future::join; |
| 16 | use {defmt_rtt as _, panic_probe as _}; | 19 | use {defmt_rtt as _, panic_probe as _}; // global logger |
| 20 | |||
| 21 | static ENABLE_USB: Signal<bool> = Signal::new(); | ||
| 22 | |||
| 23 | fn on_power_interrupt(_: *mut ()) { | ||
| 24 | let regs = unsafe { &*pac::POWER::ptr() }; | ||
| 25 | |||
| 26 | if regs.events_usbdetected.read().bits() != 0 { | ||
| 27 | regs.events_usbdetected.reset(); | ||
| 28 | info!("Vbus detected, enabling USB..."); | ||
| 29 | ENABLE_USB.signal(true); | ||
| 30 | } | ||
| 31 | |||
| 32 | if regs.events_usbremoved.read().bits() != 0 { | ||
| 33 | regs.events_usbremoved.reset(); | ||
| 34 | info!("Vbus removed, disabling USB..."); | ||
| 35 | ENABLE_USB.signal(false); | ||
| 36 | } | ||
| 37 | } | ||
| 17 | 38 | ||
| 18 | #[embassy::main] | 39 | #[embassy::main] |
| 19 | async fn main(_spawner: Spawner, p: Peripherals) { | 40 | async fn main(_spawner: Spawner, p: Peripherals) { |
| 20 | let clock: pac::CLOCK = unsafe { mem::transmute(()) }; | 41 | let clock: pac::CLOCK = unsafe { mem::transmute(()) }; |
| 21 | let power: pac::POWER = unsafe { mem::transmute(()) }; | 42 | let power: pac::POWER = unsafe { mem::transmute(()) }; |
| 22 | 43 | ||
| 44 | let power_irq = interrupt::take!(POWER_CLOCK); | ||
| 45 | power_irq.set_handler(on_power_interrupt); | ||
| 46 | power_irq.unpend(); | ||
| 47 | power_irq.enable(); | ||
| 48 | |||
| 49 | power.intenset.write(|w| w.usbdetected().set().usbremoved().set()); | ||
| 50 | |||
| 23 | info!("Enabling ext hfosc..."); | 51 | info!("Enabling ext hfosc..."); |
| 24 | clock.tasks_hfclkstart.write(|w| unsafe { w.bits(1) }); | 52 | clock.tasks_hfclkstart.write(|w| unsafe { w.bits(1) }); |
| 25 | while clock.events_hfclkstarted.read().bits() != 1 {} | 53 | while clock.events_hfclkstarted.read().bits() != 1 {} |
| 26 | 54 | ||
| 27 | info!("Waiting for vbus..."); | ||
| 28 | while !power.usbregstatus.read().vbusdetect().is_vbus_present() {} | ||
| 29 | info!("vbus OK"); | ||
| 30 | |||
| 31 | // Create the driver, from the HAL. | 55 | // Create the driver, from the HAL. |
| 32 | let irq = interrupt::take!(USBD); | 56 | let irq = interrupt::take!(USBD); |
| 33 | let driver = Driver::new(p.USBD, irq); | 57 | let driver = Driver::new(p.USBD, irq); |
| @@ -70,7 +94,7 @@ async fn main(_spawner: Spawner, p: Peripherals) { | |||
| 70 | let mut class = CdcAcmClass::new(&mut builder, &mut state, 64); | 94 | let mut class = CdcAcmClass::new(&mut builder, &mut state, 64); |
| 71 | 95 | ||
| 72 | // Build the builder. | 96 | // Build the builder. |
| 73 | let mut usb = builder.build(); | 97 | let mut usb = EnabledUsbDevice::new(builder.build(), &ENABLE_USB); |
| 74 | 98 | ||
| 75 | // Run the USB device. | 99 | // Run the USB device. |
| 76 | let usb_fut = usb.run(); | 100 | let usb_fut = usb.run(); |
