From f430c0e8c2e9703220978d9976b058ecf0117c45 Mon Sep 17 00:00:00 2001 From: Jacob Rosenthal Date: Sun, 12 Dec 2021 17:13:37 -0700 Subject: nrf-usbd --- examples/nrf/Cargo.toml | 5 +++ examples/nrf/src/bin/usb_uart.rs | 94 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 examples/nrf/src/bin/usb_uart.rs (limited to 'examples') diff --git a/examples/nrf/Cargo.toml b/examples/nrf/Cargo.toml index 5c58541a6..646ba496f 100644 --- a/examples/nrf/Cargo.toml +++ b/examples/nrf/Cargo.toml @@ -9,6 +9,7 @@ version = "0.1.0" embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt"] } embassy-traits = { version = "0.1.0", path = "../../embassy-traits", features = ["defmt"] } embassy-nrf = { version = "0.1.0", path = "../../embassy-nrf", features = ["defmt", "nrf52840", "time-driver-rtc1", "gpiote"] } +embassy-hal-common = { version = "0.1.0", path = "../../embassy-hal-common" } defmt = "0.3" defmt-rtt = "0.3" @@ -20,3 +21,7 @@ panic-probe = { version = "0.3", features = ["print-defmt"] } futures = { version = "0.3.17", default-features = false, features = ["async-await"] } rand = { version = "0.8.4", default-features = false } embedded-storage = "0.2.0" + +usb-device = "0.2" +usbd-serial = "0.1.1" +nrf-usbd = "0.1.0" diff --git a/examples/nrf/src/bin/usb_uart.rs b/examples/nrf/src/bin/usb_uart.rs new file mode 100644 index 000000000..b81fd5ee8 --- /dev/null +++ b/examples/nrf/src/bin/usb_uart.rs @@ -0,0 +1,94 @@ +#![no_std] +#![no_main] +#![feature(type_alias_impl_trait)] + +#[path = "../example_common.rs"] +mod example_common; + +use defmt::{info, unwrap}; +use defmt_rtt as _; +use embassy::interrupt::InterruptExt; +use futures::future::{select, Either}; +use futures::pin_mut; +// global logger +use panic_probe as _; // print out panic messages + +use embassy::executor::Spawner; +use embassy::io::{AsyncBufReadExt, AsyncWriteExt}; +use embassy::time::{Duration, Timer}; +use embassy_hal_common::usb::{State, Usb, UsbSerial}; +use embassy_nrf::UsbBus; +use embassy_nrf::{interrupt, Peripherals}; +use usb_device::device::{UsbDeviceBuilder, UsbVidPid}; + +#[embassy::main] +async fn main(_spawner: Spawner, _p: Peripherals) { + let mut tx_buffer = [0u8; 1024]; + let mut rx_buffer = [0u8; 640]; + + let usb_bus = UsbBus::new(); + + let serial = UsbSerial::new(&usb_bus, &mut rx_buffer, &mut tx_buffer); + + let device = UsbDeviceBuilder::new(&usb_bus, UsbVidPid(0x16c0, 0x27dd)) + .manufacturer("Fake company") + .product("Serial port") + .serial_number("TEST") + .device_class(0x02) + .build(); + + let irq = interrupt::take!(USBD); + irq.set_priority(interrupt::Priority::P3); + + let mut state = State::new(); + + let usb = unsafe { Usb::new(&mut state, device, serial, irq) }; + pin_mut!(usb); + // usb.start(); + + let (mut read_interface, mut write_interface) = usb.as_ref().take_serial_0(); + + unwrap!(write_interface.write_all(b"\r\nSend something\r\n").await); + + info!("usb initialized!"); + + let mut buf = [0u8; 64]; + loop { + let mut n = 0; + let left = { + let recv_fut = async { + loop { + let byte = unwrap!(read_interface.read_byte().await); + unwrap!(write_interface.write_byte(byte).await); + buf[n] = byte; + + n += 1; + if byte == b'\n' || byte == b'\r' || n == buf.len() { + break; + } + } + }; + pin_mut!(recv_fut); + + let timeout = Timer::after(Duration::from_ticks(32768 * 10)); + + match select(recv_fut, timeout).await { + Either::Left(_) => true, + Either::Right(_) => false, + } + }; + + if left { + for c in buf[..n].iter_mut() { + if 0x61 <= *c && *c <= 0x7a { + *c &= !0x20; + } + } + unwrap!(write_interface.write_byte(b'\n').await); + unwrap!(write_interface.write_all(&buf[..n]).await); + unwrap!(write_interface.write_byte(b'\n').await); + } else { + unwrap!(write_interface.write_all(b"\r\nSend something\r\n").await); + } + } +} -- cgit From e5dc63e8e99d1d818ed7ab3b13ffff3ee2c40a3d Mon Sep 17 00:00:00 2001 From: Jacob Rosenthal Date: Sun, 12 Dec 2021 21:32:51 -0700 Subject: usb feature gate --- examples/nrf/src/bin/usb_uart.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'examples') diff --git a/examples/nrf/src/bin/usb_uart.rs b/examples/nrf/src/bin/usb_uart.rs index b81fd5ee8..383edb348 100644 --- a/examples/nrf/src/bin/usb_uart.rs +++ b/examples/nrf/src/bin/usb_uart.rs @@ -17,7 +17,7 @@ use embassy::executor::Spawner; use embassy::io::{AsyncBufReadExt, AsyncWriteExt}; use embassy::time::{Duration, Timer}; use embassy_hal_common::usb::{State, Usb, UsbSerial}; -use embassy_nrf::UsbBus; +use embassy_nrf::usb::UsbBus; use embassy_nrf::{interrupt, Peripherals}; use usb_device::device::{UsbDeviceBuilder, UsbVidPid}; -- cgit From 83a1237ea3f8b164749cb895b7bdb7a5696107f6 Mon Sep 17 00:00:00 2001 From: Jacob Rosenthal Date: Mon, 13 Dec 2021 17:50:08 -0700 Subject: stub out the embassy registers for usbd --- examples/nrf/src/bin/usb_uart.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'examples') diff --git a/examples/nrf/src/bin/usb_uart.rs b/examples/nrf/src/bin/usb_uart.rs index 383edb348..902075dfc 100644 --- a/examples/nrf/src/bin/usb_uart.rs +++ b/examples/nrf/src/bin/usb_uart.rs @@ -17,15 +17,17 @@ use embassy::executor::Spawner; use embassy::io::{AsyncBufReadExt, AsyncWriteExt}; use embassy::time::{Duration, Timer}; use embassy_hal_common::usb::{State, Usb, UsbSerial}; -use embassy_nrf::usb::UsbBus; +use embassy_nrf::usb::{Usb as UsbDevice, UsbBus}; use embassy_nrf::{interrupt, Peripherals}; use usb_device::device::{UsbDeviceBuilder, UsbVidPid}; #[embassy::main] -async fn main(_spawner: Spawner, _p: Peripherals) { +async fn main(_spawner: Spawner, p: Peripherals) { let mut tx_buffer = [0u8; 1024]; let mut rx_buffer = [0u8; 640]; + let _usb_dev = UsbDevice::new(p.USBD); + let usb_bus = UsbBus::new(); let serial = UsbSerial::new(&usb_bus, &mut rx_buffer, &mut tx_buffer); -- cgit From 535d30335a7c4ae47e923c5e85851df80d2021a0 Mon Sep 17 00:00:00 2001 From: Jacob Rosenthal Date: Mon, 13 Dec 2021 18:13:38 -0700 Subject: make send, consolidate usb types --- examples/nrf/src/bin/usb_uart.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'examples') diff --git a/examples/nrf/src/bin/usb_uart.rs b/examples/nrf/src/bin/usb_uart.rs index 902075dfc..86ead84b5 100644 --- a/examples/nrf/src/bin/usb_uart.rs +++ b/examples/nrf/src/bin/usb_uart.rs @@ -17,7 +17,7 @@ use embassy::executor::Spawner; use embassy::io::{AsyncBufReadExt, AsyncWriteExt}; use embassy::time::{Duration, Timer}; use embassy_hal_common::usb::{State, Usb, UsbSerial}; -use embassy_nrf::usb::{Usb as UsbDevice, UsbBus}; +use embassy_nrf::usb::Usb as UsbDevice; use embassy_nrf::{interrupt, Peripherals}; use usb_device::device::{UsbDeviceBuilder, UsbVidPid}; @@ -26,9 +26,7 @@ async fn main(_spawner: Spawner, p: Peripherals) { let mut tx_buffer = [0u8; 1024]; let mut rx_buffer = [0u8; 640]; - let _usb_dev = UsbDevice::new(p.USBD); - - let usb_bus = UsbBus::new(); + let usb_bus = UsbDevice::new(p.USBD); let serial = UsbSerial::new(&usb_bus, &mut rx_buffer, &mut tx_buffer); -- cgit From f31140a70bbc7c14b07acf6305eb8a0a73560e5a Mon Sep 17 00:00:00 2001 From: Jacob Rosenthal Date: Tue, 14 Dec 2021 13:51:50 -0700 Subject: revert --- examples/nrf/src/bin/usb_uart.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'examples') diff --git a/examples/nrf/src/bin/usb_uart.rs b/examples/nrf/src/bin/usb_uart.rs index 86ead84b5..902075dfc 100644 --- a/examples/nrf/src/bin/usb_uart.rs +++ b/examples/nrf/src/bin/usb_uart.rs @@ -17,7 +17,7 @@ use embassy::executor::Spawner; use embassy::io::{AsyncBufReadExt, AsyncWriteExt}; use embassy::time::{Duration, Timer}; use embassy_hal_common::usb::{State, Usb, UsbSerial}; -use embassy_nrf::usb::Usb as UsbDevice; +use embassy_nrf::usb::{Usb as UsbDevice, UsbBus}; use embassy_nrf::{interrupt, Peripherals}; use usb_device::device::{UsbDeviceBuilder, UsbVidPid}; @@ -26,7 +26,9 @@ async fn main(_spawner: Spawner, p: Peripherals) { let mut tx_buffer = [0u8; 1024]; let mut rx_buffer = [0u8; 640]; - let usb_bus = UsbDevice::new(p.USBD); + let _usb_dev = UsbDevice::new(p.USBD); + + let usb_bus = UsbBus::new(); let serial = UsbSerial::new(&usb_bus, &mut rx_buffer, &mut tx_buffer); -- cgit From 07cbd41131a89ec0982f0ac6a3237d0544375f97 Mon Sep 17 00:00:00 2001 From: Jacob Rosenthal Date: Tue, 14 Dec 2021 15:47:54 -0700 Subject: dont expose embedded_hal_common::usb --- examples/nrf/src/bin/usb_uart.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'examples') diff --git a/examples/nrf/src/bin/usb_uart.rs b/examples/nrf/src/bin/usb_uart.rs index 902075dfc..9313fdb1e 100644 --- a/examples/nrf/src/bin/usb_uart.rs +++ b/examples/nrf/src/bin/usb_uart.rs @@ -16,8 +16,7 @@ use panic_probe as _; // print out panic messages use embassy::executor::Spawner; use embassy::io::{AsyncBufReadExt, AsyncWriteExt}; use embassy::time::{Duration, Timer}; -use embassy_hal_common::usb::{State, Usb, UsbSerial}; -use embassy_nrf::usb::{Usb as UsbDevice, UsbBus}; +use embassy_nrf::usb::{ReadInterface, State, Usb, UsbSerial, UsbThing, WriteInterface}; use embassy_nrf::{interrupt, Peripherals}; use usb_device::device::{UsbDeviceBuilder, UsbVidPid}; @@ -26,12 +25,9 @@ async fn main(_spawner: Spawner, p: Peripherals) { let mut tx_buffer = [0u8; 1024]; let mut rx_buffer = [0u8; 640]; - let _usb_dev = UsbDevice::new(p.USBD); - - let usb_bus = UsbBus::new(); + let usb_bus = UsbThing::new(); let serial = UsbSerial::new(&usb_bus, &mut rx_buffer, &mut tx_buffer); - let device = UsbDeviceBuilder::new(&usb_bus, UsbVidPid(0x16c0, 0x27dd)) .manufacturer("Fake company") .product("Serial port") -- cgit From 3debe604fbff1789794b452e630c0186836c1756 Mon Sep 17 00:00:00 2001 From: Jacob Rosenthal Date: Tue, 14 Dec 2021 16:48:48 -0700 Subject: sorta works, too many interupts? --- examples/nrf/Cargo.toml | 1 - examples/nrf/src/bin/usb_uart.rs | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) (limited to 'examples') diff --git a/examples/nrf/Cargo.toml b/examples/nrf/Cargo.toml index 646ba496f..a144cb715 100644 --- a/examples/nrf/Cargo.toml +++ b/examples/nrf/Cargo.toml @@ -9,7 +9,6 @@ version = "0.1.0" embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt"] } embassy-traits = { version = "0.1.0", path = "../../embassy-traits", features = ["defmt"] } embassy-nrf = { version = "0.1.0", path = "../../embassy-nrf", features = ["defmt", "nrf52840", "time-driver-rtc1", "gpiote"] } -embassy-hal-common = { version = "0.1.0", path = "../../embassy-hal-common" } defmt = "0.3" defmt-rtt = "0.3" diff --git a/examples/nrf/src/bin/usb_uart.rs b/examples/nrf/src/bin/usb_uart.rs index 9313fdb1e..84bce65e5 100644 --- a/examples/nrf/src/bin/usb_uart.rs +++ b/examples/nrf/src/bin/usb_uart.rs @@ -16,18 +16,19 @@ use panic_probe as _; // print out panic messages use embassy::executor::Spawner; use embassy::io::{AsyncBufReadExt, AsyncWriteExt}; use embassy::time::{Duration, Timer}; -use embassy_nrf::usb::{ReadInterface, State, Usb, UsbSerial, UsbThing, WriteInterface}; +use embassy_nrf::usb::{State, Usb, UsbSerial, UsbThing}; use embassy_nrf::{interrupt, Peripherals}; use usb_device::device::{UsbDeviceBuilder, UsbVidPid}; #[embassy::main] -async fn main(_spawner: Spawner, p: Peripherals) { +async fn main(_spawner: Spawner, _p: Peripherals) { let mut tx_buffer = [0u8; 1024]; let mut rx_buffer = [0u8; 640]; let usb_bus = UsbThing::new(); let serial = UsbSerial::new(&usb_bus, &mut rx_buffer, &mut tx_buffer); + let device = UsbDeviceBuilder::new(&usb_bus, UsbVidPid(0x16c0, 0x27dd)) .manufacturer("Fake company") .product("Serial port") @@ -42,7 +43,6 @@ async fn main(_spawner: Spawner, p: Peripherals) { let usb = unsafe { Usb::new(&mut state, device, serial, irq) }; pin_mut!(usb); - // usb.start(); let (mut read_interface, mut write_interface) = usb.as_ref().take_serial_0(); -- cgit From 5f0fefbd25333d11b6e4feb6450228c78524acd1 Mon Sep 17 00:00:00 2001 From: Jacob Rosenthal Date: Tue, 14 Dec 2021 16:51:29 -0700 Subject: dont rely on nrf-usdb --- examples/nrf/Cargo.toml | 1 - 1 file changed, 1 deletion(-) (limited to 'examples') diff --git a/examples/nrf/Cargo.toml b/examples/nrf/Cargo.toml index a144cb715..ca013f8b7 100644 --- a/examples/nrf/Cargo.toml +++ b/examples/nrf/Cargo.toml @@ -23,4 +23,3 @@ embedded-storage = "0.2.0" usb-device = "0.2" usbd-serial = "0.1.1" -nrf-usbd = "0.1.0" -- cgit From 79502330def843562b4e3fc502d687c00b3b649f Mon Sep 17 00:00:00 2001 From: Jacob Rosenthal Date: Wed, 15 Dec 2021 09:59:56 -0700 Subject: rename to UsbBus --- examples/nrf/src/bin/usb_uart.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'examples') diff --git a/examples/nrf/src/bin/usb_uart.rs b/examples/nrf/src/bin/usb_uart.rs index 84bce65e5..1df37d4ba 100644 --- a/examples/nrf/src/bin/usb_uart.rs +++ b/examples/nrf/src/bin/usb_uart.rs @@ -16,7 +16,7 @@ use panic_probe as _; // print out panic messages use embassy::executor::Spawner; use embassy::io::{AsyncBufReadExt, AsyncWriteExt}; use embassy::time::{Duration, Timer}; -use embassy_nrf::usb::{State, Usb, UsbSerial, UsbThing}; +use embassy_nrf::usb::{State, Usb, UsbBus, UsbSerial}; use embassy_nrf::{interrupt, Peripherals}; use usb_device::device::{UsbDeviceBuilder, UsbVidPid}; @@ -25,7 +25,7 @@ async fn main(_spawner: Spawner, _p: Peripherals) { let mut tx_buffer = [0u8; 1024]; let mut rx_buffer = [0u8; 640]; - let usb_bus = UsbThing::new(); + let usb_bus = UsbBus::new(); let serial = UsbSerial::new(&usb_bus, &mut rx_buffer, &mut tx_buffer); -- cgit From 61f12324ff987cc1b8bbd8fe3e7096bd7285485d Mon Sep 17 00:00:00 2001 From: Jacob Rosenthal Date: Wed, 15 Dec 2021 10:11:00 -0700 Subject: enable USB peripheral for relevant chips --- examples/nrf/src/bin/usb_uart.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'examples') diff --git a/examples/nrf/src/bin/usb_uart.rs b/examples/nrf/src/bin/usb_uart.rs index 1df37d4ba..fc7ee03b8 100644 --- a/examples/nrf/src/bin/usb_uart.rs +++ b/examples/nrf/src/bin/usb_uart.rs @@ -21,11 +21,11 @@ use embassy_nrf::{interrupt, Peripherals}; use usb_device::device::{UsbDeviceBuilder, UsbVidPid}; #[embassy::main] -async fn main(_spawner: Spawner, _p: Peripherals) { +async fn main(_spawner: Spawner, p: Peripherals) { let mut tx_buffer = [0u8; 1024]; let mut rx_buffer = [0u8; 640]; - let usb_bus = UsbBus::new(); + let usb_bus = UsbBus::new(p.USBD); let serial = UsbSerial::new(&usb_bus, &mut rx_buffer, &mut tx_buffer); -- cgit From 5d19f87acb32287d7a2034b3344a8aee5ed08fa3 Mon Sep 17 00:00:00 2001 From: Jacob Rosenthal Date: Wed, 15 Dec 2021 12:30:48 -0700 Subject: cleanup example --- examples/nrf/src/bin/usb_uart.rs | 48 +++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 23 deletions(-) (limited to 'examples') diff --git a/examples/nrf/src/bin/usb_uart.rs b/examples/nrf/src/bin/usb_uart.rs index fc7ee03b8..56b451140 100644 --- a/examples/nrf/src/bin/usb_uart.rs +++ b/examples/nrf/src/bin/usb_uart.rs @@ -40,53 +40,55 @@ async fn main(_spawner: Spawner, p: Peripherals) { irq.set_priority(interrupt::Priority::P3); let mut state = State::new(); - let usb = unsafe { Usb::new(&mut state, device, serial, irq) }; pin_mut!(usb); - let (mut read_interface, mut write_interface) = usb.as_ref().take_serial_0(); + let (mut reader, mut writer) = usb.as_ref().take_serial_0(); - unwrap!(write_interface.write_all(b"\r\nSend something\r\n").await); + unwrap!(writer.write_all(b"\r\nSend something\r\n").await); info!("usb initialized!"); let mut buf = [0u8; 64]; loop { let mut n = 0; - let left = { - let recv_fut = async { + let timed_out = { + let newline_fut = async { loop { - let byte = unwrap!(read_interface.read_byte().await); - unwrap!(write_interface.write_byte(byte).await); - buf[n] = byte; + let char = unwrap!(reader.read_byte().await); + // echo input back to screen + unwrap!(writer.write_byte(char).await); + buf[n] = char; n += 1; - if byte == b'\n' || byte == b'\r' || n == buf.len() { + if char == b'\n' || char == b'\r' || n == buf.len() { break; } } }; - pin_mut!(recv_fut); + pin_mut!(newline_fut); - let timeout = Timer::after(Duration::from_ticks(32768 * 10)); + let timeout_fut = Timer::after(Duration::from_ticks(32768 * 10)); - match select(recv_fut, timeout).await { - Either::Left(_) => true, - Either::Right(_) => false, + // select chooses whichever returns first + match select(newline_fut, timeout_fut).await { + Either::Left(_) => false, + Either::Right(_) => true, } }; - if left { - for c in buf[..n].iter_mut() { - if 0x61 <= *c && *c <= 0x7a { - *c &= !0x20; + if timed_out { + unwrap!(writer.write_all(b"\r\nTimed out\r\n").await); + } else { + for char in buf[..n].iter_mut() { + // upper case + if 0x61 <= *char && *char <= 0x7a { + *char &= !0x20; } } - unwrap!(write_interface.write_byte(b'\n').await); - unwrap!(write_interface.write_all(&buf[..n]).await); - unwrap!(write_interface.write_byte(b'\n').await); - } else { - unwrap!(write_interface.write_all(b"\r\nSend something\r\n").await); + unwrap!(writer.write_byte(b'\n').await); + unwrap!(writer.write_all(&buf[..n]).await); + unwrap!(writer.write_byte(b'\n').await); } } } -- cgit From 1f2bbe3e4a65f652edc0c2381405ea58df199130 Mon Sep 17 00:00:00 2001 From: Jacob Rosenthal Date: Thu, 16 Dec 2021 14:59:08 -0700 Subject: simplify usb_uart example --- examples/nrf/src/bin/usb_uart.rs | 60 ++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 30 deletions(-) (limited to 'examples') diff --git a/examples/nrf/src/bin/usb_uart.rs b/examples/nrf/src/bin/usb_uart.rs index 56b451140..8c386daa7 100644 --- a/examples/nrf/src/bin/usb_uart.rs +++ b/examples/nrf/src/bin/usb_uart.rs @@ -15,15 +15,15 @@ use panic_probe as _; // print out panic messages use embassy::executor::Spawner; use embassy::io::{AsyncBufReadExt, AsyncWriteExt}; -use embassy::time::{Duration, Timer}; use embassy_nrf::usb::{State, Usb, UsbBus, UsbSerial}; use embassy_nrf::{interrupt, Peripherals}; use usb_device::device::{UsbDeviceBuilder, UsbVidPid}; #[embassy::main] async fn main(_spawner: Spawner, p: Peripherals) { - let mut tx_buffer = [0u8; 1024]; - let mut rx_buffer = [0u8; 640]; + let mut rx_buffer = [0u8; 64]; + // we send back input + cr + lf + let mut tx_buffer = [0u8; 66]; let usb_bus = UsbBus::new(p.USBD); @@ -45,50 +45,50 @@ async fn main(_spawner: Spawner, p: Peripherals) { let (mut reader, mut writer) = usb.as_ref().take_serial_0(); - unwrap!(writer.write_all(b"\r\nSend something\r\n").await); - info!("usb initialized!"); + unwrap!( + writer + .write_all(b"\r\nInput returned upper cased on CR+LF\r\n") + .await + ); + let mut buf = [0u8; 64]; loop { let mut n = 0; - let timed_out = { - let newline_fut = async { - loop { - let char = unwrap!(reader.read_byte().await); - // echo input back to screen - unwrap!(writer.write_byte(char).await); - buf[n] = char; - - n += 1; - if char == b'\n' || char == b'\r' || n == buf.len() { - break; - } + + async { + loop { + let char = unwrap!(reader.read_byte().await); + + // throw away, read more on cr, exit on lf + if char == b'\r' { + continue; + } else if char == b'\n' { + break; } - }; - pin_mut!(newline_fut); - let timeout_fut = Timer::after(Duration::from_ticks(32768 * 10)); + buf[n] = char; + n += 1; - // select chooses whichever returns first - match select(newline_fut, timeout_fut).await { - Either::Left(_) => false, - Either::Right(_) => true, + // stop if we're out of room + if n == buf.len() { + break; + } } - }; + } + .await; - if timed_out { - unwrap!(writer.write_all(b"\r\nTimed out\r\n").await); - } else { + if n > 0 { for char in buf[..n].iter_mut() { // upper case if 0x61 <= *char && *char <= 0x7a { *char &= !0x20; } } - unwrap!(writer.write_byte(b'\n').await); unwrap!(writer.write_all(&buf[..n]).await); - unwrap!(writer.write_byte(b'\n').await); + unwrap!(writer.write_all(b"\r\n").await); + unwrap!(writer.flush().await); } } } -- cgit From 1d51f91368c4ba6b497cdfb5bca5b764d13074f9 Mon Sep 17 00:00:00 2001 From: Jacob Rosenthal Date: Thu, 16 Dec 2021 14:59:35 -0700 Subject: usb_uart_io example equivilent to usb_uart --- examples/nrf/src/bin/usb_uart_io.rs | 70 +++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 examples/nrf/src/bin/usb_uart_io.rs (limited to 'examples') diff --git a/examples/nrf/src/bin/usb_uart_io.rs b/examples/nrf/src/bin/usb_uart_io.rs new file mode 100644 index 000000000..f07ed8915 --- /dev/null +++ b/examples/nrf/src/bin/usb_uart_io.rs @@ -0,0 +1,70 @@ +#![no_std] +#![no_main] +#![feature(type_alias_impl_trait)] + +#[path = "../example_common.rs"] +mod example_common; + +use defmt::{info, unwrap}; +use defmt_rtt as _; +// global logger +use panic_probe as _; // print out panic messages + +use embassy::executor::Spawner; +use embassy::interrupt::InterruptExt; +use embassy::io::{read_line, AsyncWriteExt}; +use embassy_nrf::usb::{State, Usb, UsbBus, UsbSerial}; +use embassy_nrf::{interrupt, Peripherals}; +use futures::pin_mut; +use usb_device::device::{UsbDeviceBuilder, UsbVidPid}; + +#[embassy::main] +async fn main(_spawner: Spawner, p: Peripherals) { + let mut rx_buffer = [0u8; 64]; + // we send back input + cr + lf + let mut tx_buffer = [0u8; 66]; + + let usb_bus = UsbBus::new(p.USBD); + + let serial = UsbSerial::new(&usb_bus, &mut rx_buffer, &mut tx_buffer); + + let device = UsbDeviceBuilder::new(&usb_bus, UsbVidPid(0x16c0, 0x27dd)) + .manufacturer("Fake company") + .product("Serial port") + .serial_number("TEST") + .device_class(0x02) + .build(); + + let irq = interrupt::take!(USBD); + irq.set_priority(interrupt::Priority::P3); + + let mut state = State::new(); + let usb = unsafe { Usb::new(&mut state, device, serial, irq) }; + pin_mut!(usb); + + let (mut reader, mut writer) = usb.as_ref().take_serial_0(); + + info!("usb initialized!"); + + unwrap!( + writer + .write_all(b"\r\nInput returned upper cased on CR+LF\r\n") + .await + ); + + let mut buf = [0u8; 64]; + loop { + let n = unwrap!(read_line(&mut reader, &mut buf).await); + + for char in buf[..n].iter_mut() { + // upper case + if 0x61 <= *char && *char <= 0x7a { + *char &= !0x20; + } + } + + unwrap!(writer.write_all(&buf[..n]).await); + unwrap!(writer.write_all(b"\r\n").await); + unwrap!(writer.flush().await); + } +} -- cgit From e7d2c52680fb894ca44913c3b62c2ba6980f398a Mon Sep 17 00:00:00 2001 From: Jacob Rosenthal Date: Thu, 16 Dec 2021 15:20:56 -0700 Subject: example cleanup --- examples/nrf/src/bin/usb_uart.rs | 4 +--- examples/nrf/src/bin/usb_uart_io.rs | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) (limited to 'examples') diff --git a/examples/nrf/src/bin/usb_uart.rs b/examples/nrf/src/bin/usb_uart.rs index 8c386daa7..c345df9e3 100644 --- a/examples/nrf/src/bin/usb_uart.rs +++ b/examples/nrf/src/bin/usb_uart.rs @@ -6,11 +6,9 @@ mod example_common; use defmt::{info, unwrap}; -use defmt_rtt as _; +use defmt_rtt as _; // global logger use embassy::interrupt::InterruptExt; -use futures::future::{select, Either}; use futures::pin_mut; -// global logger use panic_probe as _; // print out panic messages use embassy::executor::Spawner; diff --git a/examples/nrf/src/bin/usb_uart_io.rs b/examples/nrf/src/bin/usb_uart_io.rs index f07ed8915..8fc615262 100644 --- a/examples/nrf/src/bin/usb_uart_io.rs +++ b/examples/nrf/src/bin/usb_uart_io.rs @@ -6,8 +6,7 @@ mod example_common; use defmt::{info, unwrap}; -use defmt_rtt as _; -// global logger +use defmt_rtt as _; // global logger use panic_probe as _; // print out panic messages use embassy::executor::Spawner; -- cgit