91 lines
2.3 KiB
Rust
91 lines
2.3 KiB
Rust
|
use crate::serial::Serial;
|
||
|
|
||
|
use rp_pico as bsp;
|
||
|
|
||
|
use bsp::{
|
||
|
hal::{
|
||
|
clocks::ClocksManager,
|
||
|
pac,
|
||
|
pac::{interrupt, Interrupt},
|
||
|
usb::UsbBus,
|
||
|
Clock,
|
||
|
},
|
||
|
pac::{RESETS, USBCTRL_DPRAM, USBCTRL_REGS},
|
||
|
};
|
||
|
|
||
|
use cortex_m::{delay::Delay, Peripherals as CortexPeripherals};
|
||
|
|
||
|
use usb_device::{class_prelude::*, prelude::*};
|
||
|
use usbd_hid::{
|
||
|
descriptor::{MouseReport, SerializedDescriptor},
|
||
|
hid_class::HIDClass,
|
||
|
};
|
||
|
|
||
|
static mut USB_BUS: Option<UsbBusAllocator<UsbBus>> = None;
|
||
|
static mut USB_SERIAL: Option<Serial> = None;
|
||
|
static mut USB_DEVICE: Option<UsbDevice<UsbBus>> = None;
|
||
|
|
||
|
pub struct CustomHID<'a> {
|
||
|
out_ep: EndpointOut<'a, UsbBus>,
|
||
|
in_ep: EndpointIn<'a, UsbBus>,
|
||
|
}
|
||
|
|
||
|
impl<'a> CustomHID<'a> {
|
||
|
pub fn new(
|
||
|
usbctrl_reg: USBCTRL_REGS,
|
||
|
usbctrl_dpram: USBCTRL_DPRAM,
|
||
|
resets: &mut RESETS,
|
||
|
core: CortexPeripherals,
|
||
|
clocks: ClocksManager,
|
||
|
poll_ms: u8,
|
||
|
) -> Self {
|
||
|
// Set up the USB driver
|
||
|
unsafe {
|
||
|
USB_BUS = Some(UsbBusAllocator::new(UsbBus::new(
|
||
|
usbctrl_reg,
|
||
|
usbctrl_dpram,
|
||
|
clocks.usb_clock,
|
||
|
true,
|
||
|
resets,
|
||
|
)))
|
||
|
};
|
||
|
|
||
|
unsafe {
|
||
|
USB_SERIAL = Some(Serial::new(USB_BUS.as_ref().unwrap()));
|
||
|
}
|
||
|
|
||
|
unsafe {
|
||
|
USB_DEVICE = Some(
|
||
|
UsbDeviceBuilder::new(USB_BUS.as_ref().unwrap(), UsbVidPid(0x16c0, 0x27dd))
|
||
|
.manufacturer("Fake company")
|
||
|
.product("Serial port")
|
||
|
.serial_number("TEST")
|
||
|
.device_class(2) // from: https://www.usb.org/defined-class-codes
|
||
|
.build(),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
let (in_ep, out_ep) = unsafe {
|
||
|
pac::NVIC::unmask(Interrupt::USBCTRL_IRQ);
|
||
|
|
||
|
(
|
||
|
USB_BUS.as_ref().unwrap().interrupt(64, poll_ms),
|
||
|
USB_BUS.as_ref().unwrap().interrupt(64, poll_ms),
|
||
|
)
|
||
|
};
|
||
|
|
||
|
Self { in_ep, out_ep }
|
||
|
}
|
||
|
|
||
|
pub fn run(&mut self) {}
|
||
|
}
|
||
|
|
||
|
#[allow(non_snake_case)]
|
||
|
#[interrupt]
|
||
|
unsafe fn USBCTRL_IRQ() {
|
||
|
// Handle USB request
|
||
|
let usb_dev = USB_DEVICE.as_mut().unwrap();
|
||
|
let usb_hid = USB_SERIAL.as_mut().unwrap();
|
||
|
usb_dev.poll(&mut [usb_hid]);
|
||
|
}
|