Implement a USB serial example
Lifted directly from https://github.com/rp-rs/rp-hal-boards/blob/HEAD/boards/rp-pico/examples/pico_usb_serial.rs.
This commit is contained in:
parent
a2cdaef689
commit
0cc170c719
629
Cargo.lock
generated
629
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@ -33,4 +33,4 @@ members = [
|
||||
"tree",
|
||||
"visions/server",
|
||||
"gm-dash/server"
|
||||
]
|
||||
, "pico-usb-serial"]
|
||||
|
12
pico-usb-serial/.cargo/config
Normal file
12
pico-usb-serial/.cargo/config
Normal file
@ -0,0 +1,12 @@
|
||||
[build]
|
||||
target = "thumbv6m-none-eabi"
|
||||
|
||||
[target.thumbv6m-none-eabi]
|
||||
rustflags = [
|
||||
"-C", "link-arg=--nmagic",
|
||||
"-C", "link-arg=-Tlink.x",
|
||||
"-C", "inline-threshold=5",
|
||||
"-C", "no-vectorize-loops",
|
||||
]
|
||||
|
||||
runner = "elf2uf2-rs -d"
|
23
pico-usb-serial/Cargo.toml
Normal file
23
pico-usb-serial/Cargo.toml
Normal file
@ -0,0 +1,23 @@
|
||||
[package]
|
||||
name = "pico-usb-serial"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
# az = { version = "1" }
|
||||
# cortex-m-rt = { version = "0.7.3" }
|
||||
# cortex-m = { version = "0.7.7" }
|
||||
# embedded-alloc = { version = "0.5.1" }
|
||||
# embedded-hal = { version = "0.2.7" }
|
||||
# fixed = { version = "1" }
|
||||
# fugit = { version = "0.3.7" }
|
||||
# panic-halt = { version = "0.2.0" }
|
||||
# rp-pico = { version = "0.8.0" }
|
||||
usb-device = "0.3.2"
|
||||
usbd-serial = "0.2.2"
|
||||
heapless = "0.8.0"
|
||||
rp-pico = "0.9.0"
|
||||
embedded-hal = "1.0.0"
|
||||
embedded-alloc = "0.6.0"
|
||||
cortex-m-rt = "0.7.5"
|
||||
panic-halt = "1.0.0"
|
81
pico-usb-serial/src/main.rs
Normal file
81
pico-usb-serial/src/main.rs
Normal file
@ -0,0 +1,81 @@
|
||||
// Lifted directly from https://github.com/rp-rs/rp-hal-boards/blob/HEAD/boards/rp-pico/examples/pico_usb_serial.rs
|
||||
#![no_main]
|
||||
#![no_std]
|
||||
|
||||
use core::fmt::Write;
|
||||
use heapless::String;
|
||||
use panic_halt as _;
|
||||
use rp_pico::{
|
||||
entry,
|
||||
hal::{self, pac},
|
||||
};
|
||||
use usb_device::{class_prelude::*, prelude::*};
|
||||
use usbd_serial::SerialPort;
|
||||
|
||||
#[entry]
|
||||
fn main() -> ! {
|
||||
let mut pac = pac::Peripherals::take().unwrap();
|
||||
let mut watchdog = hal::Watchdog::new(pac.WATCHDOG);
|
||||
let clocks = hal::clocks::init_clocks_and_plls(
|
||||
rp_pico::XOSC_CRYSTAL_FREQ,
|
||||
pac.XOSC,
|
||||
pac.CLOCKS,
|
||||
pac.PLL_SYS,
|
||||
pac.PLL_USB,
|
||||
&mut pac.RESETS,
|
||||
&mut watchdog,
|
||||
)
|
||||
.ok()
|
||||
.unwrap();
|
||||
|
||||
let timer = hal::Timer::new(pac.TIMER, &mut pac.RESETS, &clocks);
|
||||
|
||||
let usb_bus = UsbBusAllocator::new(hal::usb::UsbBus::new(
|
||||
pac.USBCTRL_REGS,
|
||||
pac.USBCTRL_DPRAM,
|
||||
clocks.usb_clock,
|
||||
true,
|
||||
&mut pac.RESETS,
|
||||
));
|
||||
|
||||
let mut serial = SerialPort::new(&usb_bus);
|
||||
|
||||
let mut usb_dev = UsbDeviceBuilder::new(&usb_bus, UsbVidPid(0x16c0, 0x27dd))
|
||||
.strings(&[StringDescriptors::default()
|
||||
.manufacturer("Fake company")
|
||||
.product("Serial port")
|
||||
.serial_number("TEST")])
|
||||
.unwrap()
|
||||
.device_class(2)
|
||||
.build();
|
||||
|
||||
let mut said_hello = false;
|
||||
loop {
|
||||
if !said_hello && timer.get_counter().ticks() >= 2_000_000 {
|
||||
said_hello = true;
|
||||
let _ = serial.write(b"Hello, World!\r\n");
|
||||
let time = timer.get_counter().ticks();
|
||||
let mut text: String<64> = String::new();
|
||||
writeln!(&mut text, "Current timer ticks: {}", time).unwrap();
|
||||
let _ = serial.write(text.as_bytes());
|
||||
}
|
||||
|
||||
if usb_dev.poll(&mut [&mut serial]) {
|
||||
let mut buf = [0u8; 64];
|
||||
match serial.read(&mut buf) {
|
||||
Err(_e) => {}
|
||||
Ok(0) => {}
|
||||
Ok(count) => {
|
||||
buf.iter_mut().take(count).for_each(|b| { b.make_ascii_uppercase(); });
|
||||
let mut wr_ptr = &buf[..count];
|
||||
while !wr_ptr.is_empty() {
|
||||
match serial.write(wr_ptr) {
|
||||
Ok(len) => wr_ptr = &wr_ptr[len..],
|
||||
Err(_) => break,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user