aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/nrf/src/bin/usb_serial.rs38
1 files changed, 5 insertions, 33 deletions
diff --git a/examples/nrf/src/bin/usb_serial.rs b/examples/nrf/src/bin/usb_serial.rs
index 377ae8c3a..7c1d8cbb8 100644
--- a/examples/nrf/src/bin/usb_serial.rs
+++ b/examples/nrf/src/bin/usb_serial.rs
@@ -6,47 +6,18 @@
6use core::mem; 6use core::mem;
7 7
8use defmt::{info, panic}; 8use defmt::{info, panic};
9use embassy::channel::signal::Signal;
10use embassy::executor::Spawner; 9use embassy::executor::Spawner;
11use embassy::interrupt::InterruptExt;
12use embassy_nrf::usb::{Driver, Instance}; 10use embassy_nrf::usb::{Driver, Instance};
13use embassy_nrf::{interrupt, interrupt, pac, pac, Peripherals}; 11use embassy_nrf::{interrupt, pac, Peripherals};
14use embassy_usb::driver::EndpointError; 12use embassy_usb::driver::EndpointError;
15use embassy_usb::util::EnabledUsbDevice;
16use embassy_usb::{Builder, Config}; 13use embassy_usb::{Builder, Config};
17use embassy_usb_serial::{CdcAcmClass, State}; 14use embassy_usb_serial::{CdcAcmClass, State};
18use futures::future::join; 15use futures::future::join;
19use {defmt_rtt as _, panic_probe as _}; // global logger 16use {defmt_rtt as _, panic_probe as _};
20
21static ENABLE_USB: Signal<bool> = Signal::new();
22
23fn 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}
38 17
39#[embassy::main] 18#[embassy::main]
40async fn main(_spawner: Spawner, p: Peripherals) { 19async fn main(_spawner: Spawner, p: Peripherals) {
41 let clock: pac::CLOCK = unsafe { mem::transmute(()) }; 20 let clock: pac::CLOCK = unsafe { mem::transmute(()) };
42 let power: pac::POWER = unsafe { mem::transmute(()) };
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 21
51 info!("Enabling ext hfosc..."); 22 info!("Enabling ext hfosc...");
52 clock.tasks_hfclkstart.write(|w| unsafe { w.bits(1) }); 23 clock.tasks_hfclkstart.write(|w| unsafe { w.bits(1) });
@@ -54,7 +25,8 @@ async fn main(_spawner: Spawner, p: Peripherals) {
54 25
55 // Create the driver, from the HAL. 26 // Create the driver, from the HAL.
56 let irq = interrupt::take!(USBD); 27 let irq = interrupt::take!(USBD);
57 let driver = Driver::new(p.USBD, irq); 28 let power_irq = interrupt::take!(POWER_CLOCK);
29 let driver = Driver::with_power_management(p.USBD, irq, power_irq);
58 30
59 // Create embassy-usb Config 31 // Create embassy-usb Config
60 let mut config = Config::new(0xc0de, 0xcafe); 32 let mut config = Config::new(0xc0de, 0xcafe);
@@ -94,7 +66,7 @@ async fn main(_spawner: Spawner, p: Peripherals) {
94 let mut class = CdcAcmClass::new(&mut builder, &mut state, 64); 66 let mut class = CdcAcmClass::new(&mut builder, &mut state, 64);
95 67
96 // Build the builder. 68 // Build the builder.
97 let mut usb = EnabledUsbDevice::new(builder.build(), &ENABLE_USB); 69 let mut usb = builder.build();
98 70
99 // Run the USB device. 71 // Run the USB device.
100 let usb_fut = usb.run(); 72 let usb_fut = usb.run();