aboutsummaryrefslogtreecommitdiff
path: root/examples/nrf/src/bin
diff options
context:
space:
mode:
Diffstat (limited to 'examples/nrf/src/bin')
-rw-r--r--examples/nrf/src/bin/usb_serial.rs38
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 @@
6use core::mem; 6use core::mem;
7 7
8use defmt::{info, panic}; 8use defmt::{info, panic};
9use embassy::channel::signal::Signal;
9use embassy::executor::Spawner; 10use embassy::executor::Spawner;
11use embassy::interrupt::InterruptExt;
10use embassy_nrf::usb::{Driver, Instance}; 12use embassy_nrf::usb::{Driver, Instance};
11use embassy_nrf::{interrupt, pac, Peripherals}; 13use embassy_nrf::{interrupt, interrupt, pac, pac, Peripherals};
12use embassy_usb::driver::EndpointError; 14use embassy_usb::driver::EndpointError;
15use embassy_usb::util::EnabledUsbDevice;
13use embassy_usb::{Builder, Config}; 16use embassy_usb::{Builder, Config};
14use embassy_usb_serial::{CdcAcmClass, State}; 17use embassy_usb_serial::{CdcAcmClass, State};
15use futures::future::join; 18use futures::future::join;
16use {defmt_rtt as _, panic_probe as _}; 19use {defmt_rtt as _, panic_probe as _}; // global logger
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}
17 38
18#[embassy::main] 39#[embassy::main]
19async fn main(_spawner: Spawner, p: Peripherals) { 40async 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();