aboutsummaryrefslogtreecommitdiff
path: root/examples/nrf/src/bin
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-01-04 07:41:54 +0000
committerGitHub <[email protected]>2022-01-04 07:41:54 +0000
commitf744b74e90d3bb1a571c10f0749f22132b51d303 (patch)
tree9fd7024e03a167b039a1a27696acf265e1323d77 /examples/nrf/src/bin
parentcdfd128185897b67bc1e478af6b637c863b66565 (diff)
parent7be34aa22fe735850c61a5a1c3b7304cce6ef102 (diff)
Merge #539
539: nrf: async usb r=Dirbaio a=jacobrosenthal Frankensteined together from this old pr https://github.com/embassy-rs/embassy/pull/115 and nrf-usdb ~Doesnt currently work..~ Co-authored-by: Jacob Rosenthal <[email protected]>
Diffstat (limited to 'examples/nrf/src/bin')
-rw-r--r--examples/nrf/src/bin/usb_uart.rs92
-rw-r--r--examples/nrf/src/bin/usb_uart_io.rs69
2 files changed, 161 insertions, 0 deletions
diff --git a/examples/nrf/src/bin/usb_uart.rs b/examples/nrf/src/bin/usb_uart.rs
new file mode 100644
index 000000000..c345df9e3
--- /dev/null
+++ b/examples/nrf/src/bin/usb_uart.rs
@@ -0,0 +1,92 @@
1#![no_std]
2#![no_main]
3#![feature(type_alias_impl_trait)]
4
5#[path = "../example_common.rs"]
6mod example_common;
7
8use defmt::{info, unwrap};
9use defmt_rtt as _; // global logger
10use embassy::interrupt::InterruptExt;
11use futures::pin_mut;
12use panic_probe as _; // print out panic messages
13
14use embassy::executor::Spawner;
15use embassy::io::{AsyncBufReadExt, AsyncWriteExt};
16use embassy_nrf::usb::{State, Usb, UsbBus, UsbSerial};
17use embassy_nrf::{interrupt, Peripherals};
18use usb_device::device::{UsbDeviceBuilder, UsbVidPid};
19
20#[embassy::main]
21async fn main(_spawner: Spawner, p: Peripherals) {
22 let mut rx_buffer = [0u8; 64];
23 // we send back input + cr + lf
24 let mut tx_buffer = [0u8; 66];
25
26 let usb_bus = UsbBus::new(p.USBD);
27
28 let serial = UsbSerial::new(&usb_bus, &mut rx_buffer, &mut tx_buffer);
29
30 let device = UsbDeviceBuilder::new(&usb_bus, UsbVidPid(0x16c0, 0x27dd))
31 .manufacturer("Fake company")
32 .product("Serial port")
33 .serial_number("TEST")
34 .device_class(0x02)
35 .build();
36
37 let irq = interrupt::take!(USBD);
38 irq.set_priority(interrupt::Priority::P3);
39
40 let mut state = State::new();
41 let usb = unsafe { Usb::new(&mut state, device, serial, irq) };
42 pin_mut!(usb);
43
44 let (mut reader, mut writer) = usb.as_ref().take_serial_0();
45
46 info!("usb initialized!");
47
48 unwrap!(
49 writer
50 .write_all(b"\r\nInput returned upper cased on CR+LF\r\n")
51 .await
52 );
53
54 let mut buf = [0u8; 64];
55 loop {
56 let mut n = 0;
57
58 async {
59 loop {
60 let char = unwrap!(reader.read_byte().await);
61
62 // throw away, read more on cr, exit on lf
63 if char == b'\r' {
64 continue;
65 } else if char == b'\n' {
66 break;
67 }
68
69 buf[n] = char;
70 n += 1;
71
72 // stop if we're out of room
73 if n == buf.len() {
74 break;
75 }
76 }
77 }
78 .await;
79
80 if n > 0 {
81 for char in buf[..n].iter_mut() {
82 // upper case
83 if 0x61 <= *char && *char <= 0x7a {
84 *char &= !0x20;
85 }
86 }
87 unwrap!(writer.write_all(&buf[..n]).await);
88 unwrap!(writer.write_all(b"\r\n").await);
89 unwrap!(writer.flush().await);
90 }
91 }
92}
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..8fc615262
--- /dev/null
+++ b/examples/nrf/src/bin/usb_uart_io.rs
@@ -0,0 +1,69 @@
1#![no_std]
2#![no_main]
3#![feature(type_alias_impl_trait)]
4
5#[path = "../example_common.rs"]
6mod example_common;
7
8use defmt::{info, unwrap};
9use defmt_rtt as _; // global logger
10use panic_probe as _; // print out panic messages
11
12use embassy::executor::Spawner;
13use embassy::interrupt::InterruptExt;
14use embassy::io::{read_line, AsyncWriteExt};
15use embassy_nrf::usb::{State, Usb, UsbBus, UsbSerial};
16use embassy_nrf::{interrupt, Peripherals};
17use futures::pin_mut;
18use usb_device::device::{UsbDeviceBuilder, UsbVidPid};
19
20#[embassy::main]
21async fn main(_spawner: Spawner, p: Peripherals) {
22 let mut rx_buffer = [0u8; 64];
23 // we send back input + cr + lf
24 let mut tx_buffer = [0u8; 66];
25
26 let usb_bus = UsbBus::new(p.USBD);
27
28 let serial = UsbSerial::new(&usb_bus, &mut rx_buffer, &mut tx_buffer);
29
30 let device = UsbDeviceBuilder::new(&usb_bus, UsbVidPid(0x16c0, 0x27dd))
31 .manufacturer("Fake company")
32 .product("Serial port")
33 .serial_number("TEST")
34 .device_class(0x02)
35 .build();
36
37 let irq = interrupt::take!(USBD);
38 irq.set_priority(interrupt::Priority::P3);
39
40 let mut state = State::new();
41 let usb = unsafe { Usb::new(&mut state, device, serial, irq) };
42 pin_mut!(usb);
43
44 let (mut reader, mut writer) = usb.as_ref().take_serial_0();
45
46 info!("usb initialized!");
47
48 unwrap!(
49 writer
50 .write_all(b"\r\nInput returned upper cased on CR+LF\r\n")
51 .await
52 );
53
54 let mut buf = [0u8; 64];
55 loop {
56 let n = unwrap!(read_line(&mut reader, &mut buf).await);
57
58 for char in buf[..n].iter_mut() {
59 // upper case
60 if 0x61 <= *char && *char <= 0x7a {
61 *char &= !0x20;
62 }
63 }
64
65 unwrap!(writer.write_all(&buf[..n]).await);
66 unwrap!(writer.write_all(b"\r\n").await);
67 unwrap!(writer.flush().await);
68 }
69}