Compare commits

...

1 Commits

5 changed files with 687 additions and 60 deletions

629
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -33,4 +33,4 @@ members = [
"tree",
"visions/server",
"gm-dash/server"
]
, "pico-usb-serial"]

View 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"

View 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"

View 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,
};
}
}
}
}
}
}