aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThales Fragoso <[email protected]>2021-02-25 00:09:41 -0300
committerThales Fragoso <[email protected]>2021-03-19 19:44:30 -0300
commita39dea4d98232c9b27608d183b4cd14f2b05ad53 (patch)
tree0d914346387b6ba3d0c7a669fbe778209c86d41b
parentc4e79f66ea6e0d61c1b29bd2ca8ee1da15d8f7ea (diff)
Bring back old usb example
-rw-r--r--embassy-stm32f4-examples/src/bin/usb_serial.rs79
-rw-r--r--embassy-stm32f4-examples/src/bin/usb_serial2.rs148
2 files changed, 185 insertions, 42 deletions
diff --git a/embassy-stm32f4-examples/src/bin/usb_serial.rs b/embassy-stm32f4-examples/src/bin/usb_serial.rs
index cf04c772e..90139c5ac 100644
--- a/embassy-stm32f4-examples/src/bin/usb_serial.rs
+++ b/embassy-stm32f4-examples/src/bin/usb_serial.rs
@@ -10,11 +10,12 @@ use cortex_m_rt::entry;
10use defmt::panic; 10use defmt::panic;
11use embassy::executor::{task, Executor}; 11use embassy::executor::{task, Executor};
12use embassy::io::{AsyncBufReadExt, AsyncWriteExt}; 12use embassy::io::{AsyncBufReadExt, AsyncWriteExt};
13use embassy::time::{Duration, Timer};
13use embassy::util::Forever; 14use embassy::util::Forever;
14use embassy_stm32f4::interrupt::OwnedInterrupt; 15use embassy_stm32f4::interrupt::OwnedInterrupt;
15use embassy_stm32f4::usb::Usb; 16use embassy_stm32f4::usb::Usb;
16use embassy_stm32f4::usb_serial::UsbSerial; 17use embassy_stm32f4::usb_serial::UsbSerial;
17use embassy_stm32f4::{interrupt, pac}; 18use embassy_stm32f4::{interrupt, pac, rtc};
18use futures::future::{select, Either}; 19use futures::future::{select, Either};
19use futures::pin_mut; 20use futures::pin_mut;
20use stm32f4xx_hal::otg_fs::{UsbBus, USB}; 21use stm32f4xx_hal::otg_fs::{UsbBus, USB};
@@ -26,81 +27,68 @@ use usb_device::prelude::*;
26async fn run1(bus: &'static mut UsbBusAllocator<UsbBus<USB>>) { 27async fn run1(bus: &'static mut UsbBusAllocator<UsbBus<USB>>) {
27 info!("Async task"); 28 info!("Async task");
28 29
29 let mut read_buf1 = [0u8; 128]; 30 let mut read_buf = [0u8; 128];
30 let mut write_buf1 = [0u8; 128]; 31 let mut write_buf = [0u8; 128];
31 let serial1 = UsbSerial::new(bus, &mut read_buf1, &mut write_buf1); 32 let serial = UsbSerial::new(bus, &mut read_buf, &mut write_buf);
32
33 let mut read_buf2 = [0u8; 128];
34 let mut write_buf2 = [0u8; 128];
35 let serial2 = UsbSerial::new(bus, &mut read_buf2, &mut write_buf2);
36 33
37 let device = UsbDeviceBuilder::new(bus, UsbVidPid(0x16c0, 0x27dd)) 34 let device = UsbDeviceBuilder::new(bus, UsbVidPid(0x16c0, 0x27dd))
38 .manufacturer("Fake company") 35 .manufacturer("Fake company")
39 .product("Serial port") 36 .product("Serial port")
40 .serial_number("TEST") 37 .serial_number("TEST")
41 //.device_class(0x02) 38 .device_class(0x02)
42 .build(); 39 .build();
43 40
44 let irq = interrupt::take!(OTG_FS); 41 let irq = interrupt::take!(OTG_FS);
45 irq.set_priority(interrupt::Priority::Level3); 42 irq.set_priority(interrupt::Priority::Level3);
46 43
47 let usb = Usb::new(device, (serial1, serial2), irq); 44 let usb = Usb::new(device, serial, irq);
48 pin_mut!(usb); 45 pin_mut!(usb);
49 46
50 let (mut read_interface1, mut write_interface1) = usb.as_ref().take_serial_0(); 47 let (mut read_interface, mut write_interface) = usb.as_ref().take_serial_0();
51 let (mut read_interface2, mut write_interface2) = usb.as_ref().take_serial_1();
52
53 let mut buf1 = [0u8; 64];
54 let mut buf2 = [0u8; 64];
55 48
49 let mut buf = [0u8; 64];
56 loop { 50 loop {
57 let mut n1 = 0; 51 let mut n = 0;
58 let mut n2 = 0;
59 let left = { 52 let left = {
60 let read_line1 = async { 53 let recv_fut = async {
61 loop { 54 loop {
62 let byte = unwrap!(read_interface1.read_byte().await); 55 let byte = unwrap!(read_interface.read_byte().await);
63 unwrap!(write_interface1.write_byte(byte).await); 56 unwrap!(write_interface.write_byte(byte).await);
64 buf1[n1] = byte; 57 buf[n] = byte;
65 58
66 n1 += 1; 59 n += 1;
67 if byte == b'\n' || n1 == buf1.len() { 60 if byte == b'\n' || byte == b'\r' || n == buf.len() {
68 break; 61 break;
69 } 62 }
70 } 63 }
71 }; 64 };
72 pin_mut!(read_line1); 65 pin_mut!(recv_fut);
73
74 let read_line2 = async {
75 loop {
76 let byte = unwrap!(read_interface2.read_byte().await);
77 unwrap!(write_interface2.write_byte(byte).await);
78 buf2[n2] = byte;
79 66
80 n2 += 1; 67 let timeout = Timer::after(Duration::from_ticks(32768 * 10));
81 if byte == b'\n' || n2 == buf2.len() {
82 break;
83 }
84 }
85 };
86 pin_mut!(read_line2);
87 68
88 match select(read_line1, read_line2).await { 69 match select(recv_fut, timeout).await {
89 Either::Left(_) => true, 70 Either::Left(_) => true,
90 Either::Right(_) => false, 71 Either::Right(_) => false,
91 } 72 }
92 }; 73 };
93 74
94 if left { 75 if left {
95 unwrap!(write_interface2.write_all(b"\r\n").await); 76 for c in buf[..n].iter_mut() {
96 unwrap!(write_interface2.write_all(&buf1[..n1]).await); 77 if 0x61 <= *c && *c <= 0x7a {
78 *c &= !0x20;
79 }
80 }
81 unwrap!(write_interface.write_byte(b'\n').await);
82 unwrap!(write_interface.write_all(&buf[..n]).await);
83 unwrap!(write_interface.write_byte(b'\n').await);
97 } else { 84 } else {
98 unwrap!(write_interface1.write_all(b"\r\n").await); 85 unwrap!(write_interface.write_all(b"\r\nSend something\r\n").await);
99 unwrap!(write_interface1.write_all(&buf2[..n2]).await);
100 } 86 }
101 } 87 }
102} 88}
103 89
90static RTC: Forever<rtc::RTC<pac::TIM2>> = Forever::new();
91static ALARM: Forever<rtc::Alarm<pac::TIM2>> = Forever::new();
104static EXECUTOR: Forever<Executor> = Forever::new(); 92static EXECUTOR: Forever<Executor> = Forever::new();
105static USB_BUS: Forever<UsbBusAllocator<UsbBus<USB>>> = Forever::new(); 93static USB_BUS: Forever<UsbBusAllocator<UsbBus<USB>>> = Forever::new();
106 94
@@ -127,7 +115,14 @@ fn main() -> ! {
127 w.dbg_stop().set_bit() 115 w.dbg_stop().set_bit()
128 }); 116 });
129 117
118 let rtc = RTC.put(rtc::RTC::new(p.TIM2, interrupt::take!(TIM2), clocks));
119 rtc.start();
120
121 unsafe { embassy::time::set_clock(rtc) };
122
123 let alarm = ALARM.put(rtc.alarm1());
130 let executor = EXECUTOR.put(Executor::new()); 124 let executor = EXECUTOR.put(Executor::new());
125 executor.set_alarm(alarm);
131 126
132 let gpioa = p.GPIOA.split(); 127 let gpioa = p.GPIOA.split();
133 let usb = USB { 128 let usb = USB {
diff --git a/embassy-stm32f4-examples/src/bin/usb_serial2.rs b/embassy-stm32f4-examples/src/bin/usb_serial2.rs
new file mode 100644
index 000000000..79e323ca6
--- /dev/null
+++ b/embassy-stm32f4-examples/src/bin/usb_serial2.rs
@@ -0,0 +1,148 @@
1#![no_std]
2#![no_main]
3#![feature(type_alias_impl_trait)]
4
5#[path = "../example_common.rs"]
6mod example_common;
7use example_common::*;
8
9use cortex_m_rt::entry;
10use defmt::panic;
11use embassy::executor::{task, Executor};
12use embassy::io::{AsyncBufReadExt, AsyncWriteExt};
13use embassy::util::Forever;
14use embassy_stm32f4::interrupt::OwnedInterrupt;
15use embassy_stm32f4::usb::Usb;
16use embassy_stm32f4::usb_serial::UsbSerial;
17use embassy_stm32f4::{interrupt, pac};
18use futures::future::{select, Either};
19use futures::pin_mut;
20use stm32f4xx_hal::otg_fs::{UsbBus, USB};
21use stm32f4xx_hal::prelude::*;
22use usb_device::bus::UsbBusAllocator;
23use usb_device::prelude::*;
24
25#[task]
26async fn run1(bus: &'static mut UsbBusAllocator<UsbBus<USB>>) {
27 info!("Async task");
28
29 let mut read_buf1 = [0u8; 128];
30 let mut write_buf1 = [0u8; 128];
31 let serial1 = UsbSerial::new(bus, &mut read_buf1, &mut write_buf1);
32
33 let mut read_buf2 = [0u8; 128];
34 let mut write_buf2 = [0u8; 128];
35 let serial2 = UsbSerial::new(bus, &mut read_buf2, &mut write_buf2);
36
37 let device = UsbDeviceBuilder::new(bus, UsbVidPid(0x16c0, 0x27dd))
38 .manufacturer("Fake company")
39 .product("Serial port")
40 .serial_number("TEST")
41 //.device_class(0x02)
42 .build();
43
44 let irq = interrupt::take!(OTG_FS);
45 irq.set_priority(interrupt::Priority::Level3);
46
47 let usb = Usb::new(device, (serial1, serial2), irq);
48 pin_mut!(usb);
49
50 let (mut read_interface1, mut write_interface1) = usb.as_ref().take_serial_0();
51 let (mut read_interface2, mut write_interface2) = usb.as_ref().take_serial_1();
52
53 let mut buf1 = [0u8; 64];
54 let mut buf2 = [0u8; 64];
55
56 loop {
57 let mut n1 = 0;
58 let mut n2 = 0;
59 let left = {
60 let read_line1 = async {
61 loop {
62 let byte = unwrap!(read_interface1.read_byte().await);
63 unwrap!(write_interface1.write_byte(byte).await);
64 buf1[n1] = byte;
65
66 n1 += 1;
67 if byte == b'\n' || byte == b'\r' || n1 == buf1.len() {
68 break;
69 }
70 }
71 };
72 pin_mut!(read_line1);
73
74 let read_line2 = async {
75 loop {
76 let byte = unwrap!(read_interface2.read_byte().await);
77 unwrap!(write_interface2.write_byte(byte).await);
78 buf2[n2] = byte;
79
80 n2 += 1;
81 if byte == b'\n' || byte == b'\r' || n2 == buf2.len() {
82 break;
83 }
84 }
85 };
86 pin_mut!(read_line2);
87
88 match select(read_line1, read_line2).await {
89 Either::Left(_) => true,
90 Either::Right(_) => false,
91 }
92 };
93
94 if left {
95 unwrap!(write_interface2.write_all(b"\r\n").await);
96 unwrap!(write_interface2.write_all(&buf1[..n1]).await);
97 } else {
98 unwrap!(write_interface1.write_all(b"\r\n").await);
99 unwrap!(write_interface1.write_all(&buf2[..n2]).await);
100 }
101 }
102}
103
104static EXECUTOR: Forever<Executor> = Forever::new();
105static USB_BUS: Forever<UsbBusAllocator<UsbBus<USB>>> = Forever::new();
106
107#[entry]
108fn main() -> ! {
109 static mut EP_MEMORY: [u32; 1024] = [0; 1024];
110
111 info!("Hello World!");
112
113 let p = unwrap!(pac::Peripherals::take());
114
115 p.RCC.ahb1enr.modify(|_, w| w.dma1en().enabled());
116 let rcc = p.RCC.constrain();
117 let clocks = rcc
118 .cfgr
119 .use_hse(25.mhz())
120 .sysclk(48.mhz())
121 .require_pll48clk()
122 .freeze();
123
124 p.DBGMCU.cr.modify(|_, w| {
125 w.dbg_sleep().set_bit();
126 w.dbg_standby().set_bit();
127 w.dbg_stop().set_bit()
128 });
129
130 let executor = EXECUTOR.put(Executor::new());
131
132 let gpioa = p.GPIOA.split();
133 let usb = USB {
134 usb_global: p.OTG_FS_GLOBAL,
135 usb_device: p.OTG_FS_DEVICE,
136 usb_pwrclk: p.OTG_FS_PWRCLK,
137 pin_dm: gpioa.pa11.into_alternate_af10(),
138 pin_dp: gpioa.pa12.into_alternate_af10(),
139 hclk: clocks.hclk(),
140 };
141 // Rust analyzer isn't recognizing the static ref magic `cortex-m` does
142 #[allow(unused_unsafe)]
143 let usb_bus = USB_BUS.put(UsbBus::new(usb, unsafe { EP_MEMORY }));
144
145 executor.run(move |spawner| {
146 unwrap!(spawner.spawn(run1(usb_bus)));
147 });
148}