Switched to rtic to enable usb communication
This commit is contained in:
parent
c5dfb6e3b1
commit
a94a2376f6
|
@ -6,6 +6,7 @@ version = "0.1.0"
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cortex-m = "0.7"
|
cortex-m = "0.7"
|
||||||
cortex-m-rt = "0.7"
|
cortex-m-rt = "0.7"
|
||||||
|
cortex-m-rtic = "1.1.2"
|
||||||
embedded-hal = { version = "0.2.5", features = ["unproven"] }
|
embedded-hal = { version = "0.2.5", features = ["unproven"] }
|
||||||
|
|
||||||
defmt = "0.3"
|
defmt = "0.3"
|
||||||
|
@ -14,6 +15,11 @@ panic-probe = { version = "0.3", features = ["print-defmt"] }
|
||||||
|
|
||||||
# We're using a Pico by default on this template
|
# We're using a Pico by default on this template
|
||||||
rp-pico = "0.5"
|
rp-pico = "0.5"
|
||||||
|
rp2040-monotonic = "1.1.0"
|
||||||
|
|
||||||
|
usb-device = "0.2.8"
|
||||||
|
usbd-serial = "0.1.1"
|
||||||
|
usbd-hid = "0.5.1"
|
||||||
|
|
||||||
# but you can use any BSP. Uncomment this to use the pro_micro_rp2040 BSP instead
|
# but you can use any BSP. Uncomment this to use the pro_micro_rp2040 BSP instead
|
||||||
# sparkfun-pro-micro-rp2040 = "0.3"
|
# sparkfun-pro-micro-rp2040 = "0.3"
|
||||||
|
|
299
src/main.rs
299
src/main.rs
|
@ -4,149 +4,200 @@
|
||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
|
|
||||||
use bsp::entry;
|
|
||||||
use defmt::*;
|
|
||||||
use defmt_rtt as _;
|
use defmt_rtt as _;
|
||||||
use embedded_hal::digital::v2::OutputPin;
|
|
||||||
use panic_probe as _;
|
use panic_probe as _;
|
||||||
|
|
||||||
// Provide an alias for our BSP so we can switch targets quickly.
|
|
||||||
// Uncomment the BSP you included in Cargo.toml, the rest of the code does not need to change.
|
|
||||||
use rp_pico as bsp;
|
|
||||||
// use sparkfun_pro_micro_rp2040 as bsp;
|
|
||||||
|
|
||||||
use bsp::hal::{
|
|
||||||
clocks::{init_clocks_and_plls, Clock},
|
|
||||||
pac,
|
|
||||||
sio::Sio,
|
|
||||||
watchdog::Watchdog,
|
|
||||||
};
|
|
||||||
|
|
||||||
mod flipdot;
|
mod flipdot;
|
||||||
use crate::flipdot::write_display;
|
|
||||||
|
|
||||||
#[entry]
|
#[rtic::app(device = rp_pico::hal::pac, peripherals = true, dispatchers = [XIP_IRQ])]
|
||||||
fn main() -> ! {
|
mod app {
|
||||||
info!("Program start");
|
|
||||||
let mut pac = pac::Peripherals::take().unwrap();
|
|
||||||
let core = pac::CorePeripherals::take().unwrap();
|
|
||||||
let mut watchdog = Watchdog::new(pac.WATCHDOG);
|
|
||||||
let sio = Sio::new(pac.SIO);
|
|
||||||
|
|
||||||
// External high-speed crystal on the pico board is 12Mhz
|
use embedded_hal::digital::v2::OutputPin;
|
||||||
let external_xtal_freq_hz = 12_000_000u32;
|
|
||||||
let clocks = init_clocks_and_plls(
|
|
||||||
external_xtal_freq_hz,
|
|
||||||
pac.XOSC,
|
|
||||||
pac.CLOCKS,
|
|
||||||
pac.PLL_SYS,
|
|
||||||
pac.PLL_USB,
|
|
||||||
&mut pac.RESETS,
|
|
||||||
&mut watchdog,
|
|
||||||
)
|
|
||||||
.ok()
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let mut delay = cortex_m::delay::Delay::new(core.SYST, clocks.system_clock.freq().to_Hz());
|
use rp_pico::hal;
|
||||||
|
use rp_pico::hal::*;
|
||||||
|
use rp_pico::XOSC_CRYSTAL_FREQ;
|
||||||
|
|
||||||
let pins = bsp::Pins::new(
|
// USB Device support
|
||||||
pac.IO_BANK0,
|
use usb_device::{class_prelude::*, prelude::*};
|
||||||
pac.PADS_BANK0,
|
// USB Communications Class Device support
|
||||||
sio.gpio_bank0,
|
use usbd_serial::SerialPort;
|
||||||
&mut pac.RESETS,
|
|
||||||
);
|
|
||||||
|
|
||||||
let mut led_pin = pins.led.into_push_pull_output();
|
use rp2040_monotonic::fugit::ExtU64;
|
||||||
|
use rp2040_monotonic::*;
|
||||||
|
|
||||||
let mut row_data_pin = pins.gpio4.into_push_pull_output();
|
use crate::flipdot::write_display;
|
||||||
let mut row_clock_pin = pins.gpio5.into_push_pull_output();
|
|
||||||
|
|
||||||
let mut col_data_pin = pins.gpio2.into_push_pull_output();
|
#[monotonic(binds = TIMER_IRQ_0, default = true)]
|
||||||
let mut col_clock_pin = pins.gpio3.into_push_pull_output();
|
type Monotonic = Rp2040Monotonic;
|
||||||
|
|
||||||
let mut white_pin = pins.gpio6.into_push_pull_output();
|
#[shared]
|
||||||
let mut black_pin = pins.gpio7.into_push_pull_output();
|
struct Shared {
|
||||||
let mut strobe_pin = pins.gpio8.into_push_pull_output();
|
serial: SerialPort<'static, hal::usb::UsbBus>,
|
||||||
|
usb_dev: usb_device::device::UsbDevice<'static, hal::usb::UsbBus>,
|
||||||
|
}
|
||||||
|
|
||||||
write_display(
|
#[local]
|
||||||
&[0; 16],
|
struct Local {
|
||||||
&mut col_clock_pin,
|
led_pin: hal::gpio::Pin<hal::gpio::pin::bank0::Gpio25, hal::gpio::PushPullOutput>,
|
||||||
&mut col_data_pin,
|
row_data_pin: hal::gpio::Pin<hal::gpio::pin::bank0::Gpio4, hal::gpio::PushPullOutput>,
|
||||||
&mut row_clock_pin,
|
row_clock_pin: hal::gpio::Pin<hal::gpio::pin::bank0::Gpio5, hal::gpio::PushPullOutput>,
|
||||||
&mut row_data_pin,
|
col_data_pin: hal::gpio::Pin<hal::gpio::pin::bank0::Gpio2, hal::gpio::PushPullOutput>,
|
||||||
&mut strobe_pin,
|
col_clock_pin: hal::gpio::Pin<hal::gpio::pin::bank0::Gpio3, hal::gpio::PushPullOutput>,
|
||||||
&mut white_pin,
|
white_pin: hal::gpio::Pin<hal::gpio::pin::bank0::Gpio6, hal::gpio::PushPullOutput>,
|
||||||
&mut black_pin,
|
black_pin: hal::gpio::Pin<hal::gpio::pin::bank0::Gpio7, hal::gpio::PushPullOutput>,
|
||||||
&mut delay,
|
strobe_pin: hal::gpio::Pin<hal::gpio::pin::bank0::Gpio8, hal::gpio::PushPullOutput>,
|
||||||
);
|
delay: cortex_m::delay::Delay,
|
||||||
|
pattern: bool,
|
||||||
|
}
|
||||||
|
|
||||||
let pattern1 = [
|
#[init(local = [usb_bus: Option<usb_device::bus::UsbBusAllocator<hal::usb::UsbBus>> = None])]
|
||||||
0b1010_1010_1010_1010_1010,
|
fn init(c: init::Context) -> (Shared, Local, init::Monotonics) {
|
||||||
0b0101_0101_0101_0101_0101,
|
let mut resets = c.device.RESETS;
|
||||||
0b1010_1010_1010_1010_1010,
|
let mut watchdog = hal::watchdog::Watchdog::new(c.device.WATCHDOG);
|
||||||
0b0101_0101_0101_0101_0101,
|
|
||||||
0b1010_1010_1010_1010_1010,
|
|
||||||
0b0101_0100_0000_0101_0101,
|
|
||||||
0b1010_1010_1111_0010_1010,
|
|
||||||
0b0101_0100_0001_0101_0101,
|
|
||||||
0b1010_1010_0001_0010_1010,
|
|
||||||
0b0101_0100_1001_0101_0101,
|
|
||||||
0b1010_1010_0000_0010_1010,
|
|
||||||
0b0101_0101_0101_0101_0101,
|
|
||||||
0b1010_1010_1010_1010_1010,
|
|
||||||
0b0101_0101_0101_0101_0101,
|
|
||||||
0b1010_1010_1010_1010_1010,
|
|
||||||
0b0101_0101_0101_0101_0101,
|
|
||||||
];
|
|
||||||
|
|
||||||
let pattern2 = [
|
// Configure the clocks - The default is to generate a 125 MHz system clock
|
||||||
0b0101_0101_0101_0101_0101,
|
let clocks = hal::clocks::init_clocks_and_plls(
|
||||||
0b1010_1010_1010_1010_1010,
|
XOSC_CRYSTAL_FREQ,
|
||||||
0b0101_0101_0101_0101_0101,
|
c.device.XOSC,
|
||||||
0b1010_1010_1010_1010_1010,
|
c.device.CLOCKS,
|
||||||
0b0101_0101_0101_0101_0101,
|
c.device.PLL_SYS,
|
||||||
0b1010_1010_0000_0010_1010,
|
c.device.PLL_USB,
|
||||||
0b0101_0100_1111_0101_0101,
|
&mut resets,
|
||||||
0b1010_1010_0001_0010_1010,
|
&mut watchdog,
|
||||||
0b0101_0100_0001_0101_0101,
|
)
|
||||||
0b1010_1010_1001_0010_1010,
|
.ok()
|
||||||
0b0101_0100_0000_0101_0101,
|
.unwrap();
|
||||||
0b1010_1010_1010_1010_1010,
|
|
||||||
0b0101_0101_0101_0101_0101,
|
|
||||||
0b1010_1010_1010_1010_1010,
|
|
||||||
0b0101_0101_0101_0101_0101,
|
|
||||||
0b1010_1010_1010_1010_1010,
|
|
||||||
];
|
|
||||||
|
|
||||||
loop {
|
let mut delay =
|
||||||
|
cortex_m::delay::Delay::new(c.core.SYST, clocks.system_clock.freq().to_Hz());
|
||||||
|
|
||||||
|
let usb_bus: &'static _ =
|
||||||
|
c.local
|
||||||
|
.usb_bus
|
||||||
|
.insert(UsbBusAllocator::new(hal::usb::UsbBus::new(
|
||||||
|
c.device.USBCTRL_REGS,
|
||||||
|
c.device.USBCTRL_DPRAM,
|
||||||
|
clocks.usb_clock,
|
||||||
|
true,
|
||||||
|
&mut resets,
|
||||||
|
)));
|
||||||
|
|
||||||
|
let serial = SerialPort::new(usb_bus);
|
||||||
|
|
||||||
|
let usb_dev = UsbDeviceBuilder::new(usb_bus, 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 sio = hal::Sio::new(c.device.SIO);
|
||||||
|
let pins = rp_pico::Pins::new(
|
||||||
|
c.device.IO_BANK0,
|
||||||
|
c.device.PADS_BANK0,
|
||||||
|
sio.gpio_bank0,
|
||||||
|
&mut resets,
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut led_pin = pins.led.into_push_pull_output();
|
||||||
led_pin.set_low().unwrap();
|
led_pin.set_low().unwrap();
|
||||||
write_display(
|
|
||||||
&pattern1,
|
|
||||||
&mut col_clock_pin,
|
|
||||||
&mut col_data_pin,
|
|
||||||
&mut row_clock_pin,
|
|
||||||
&mut row_data_pin,
|
|
||||||
&mut strobe_pin,
|
|
||||||
&mut white_pin,
|
|
||||||
&mut black_pin,
|
|
||||||
&mut delay,
|
|
||||||
);
|
|
||||||
delay.delay_ms(1000);
|
|
||||||
|
|
||||||
led_pin.set_high().unwrap();
|
let row_data_pin = pins.gpio4.into_push_pull_output();
|
||||||
|
let row_clock_pin = pins.gpio5.into_push_pull_output();
|
||||||
|
|
||||||
|
let col_data_pin = pins.gpio2.into_push_pull_output();
|
||||||
|
let col_clock_pin = pins.gpio3.into_push_pull_output();
|
||||||
|
|
||||||
|
let white_pin = pins.gpio6.into_push_pull_output();
|
||||||
|
let black_pin = pins.gpio7.into_push_pull_output();
|
||||||
|
let strobe_pin = pins.gpio8.into_push_pull_output();
|
||||||
|
|
||||||
|
let pattern = false;
|
||||||
|
|
||||||
|
update_display::spawn_after(1.secs()).unwrap();
|
||||||
|
|
||||||
|
(
|
||||||
|
Shared { serial, usb_dev },
|
||||||
|
Local {
|
||||||
|
led_pin,
|
||||||
|
row_data_pin,
|
||||||
|
row_clock_pin,
|
||||||
|
col_data_pin,
|
||||||
|
col_clock_pin,
|
||||||
|
white_pin,
|
||||||
|
black_pin,
|
||||||
|
strobe_pin,
|
||||||
|
delay,
|
||||||
|
pattern,
|
||||||
|
},
|
||||||
|
init::Monotonics(Rp2040Monotonic::new(c.device.TIMER)),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[task(local = [pattern, led_pin, row_data_pin, row_clock_pin, col_data_pin,
|
||||||
|
col_clock_pin, white_pin, black_pin, strobe_pin, delay])]
|
||||||
|
fn update_display(cx: update_display::Context) {
|
||||||
|
let pattern = if *cx.local.pattern {
|
||||||
|
[
|
||||||
|
0b1010_1010_1010_1010_1010,
|
||||||
|
0b0101_0101_0101_0101_0101,
|
||||||
|
0b1010_1010_1010_1010_1010,
|
||||||
|
0b0101_0101_0101_0101_0101,
|
||||||
|
0b1010_1010_1010_1010_1010,
|
||||||
|
0b0101_0100_0000_0101_0101,
|
||||||
|
0b1010_1010_1111_0010_1010,
|
||||||
|
0b0101_0100_0001_0101_0101,
|
||||||
|
0b1010_1010_0001_0010_1010,
|
||||||
|
0b0101_0100_1001_0101_0101,
|
||||||
|
0b1010_1010_0000_0010_1010,
|
||||||
|
0b0101_0101_0101_0101_0101,
|
||||||
|
0b1010_1010_1010_1010_1010,
|
||||||
|
0b0101_0101_0101_0101_0101,
|
||||||
|
0b1010_1010_1010_1010_1010,
|
||||||
|
0b0101_0101_0101_0101_0101,
|
||||||
|
]
|
||||||
|
} else {
|
||||||
|
[
|
||||||
|
0b0101_0101_0101_0101_0101,
|
||||||
|
0b1010_1010_1010_1010_1010,
|
||||||
|
0b0101_0101_0101_0101_0101,
|
||||||
|
0b1010_1010_1010_1010_1010,
|
||||||
|
0b0101_0101_0101_0101_0101,
|
||||||
|
0b1010_1010_0000_0010_1010,
|
||||||
|
0b0101_0100_1111_0101_0101,
|
||||||
|
0b1010_1010_0001_0010_1010,
|
||||||
|
0b0101_0100_0001_0101_0101,
|
||||||
|
0b1010_1010_1001_0010_1010,
|
||||||
|
0b0101_0100_0000_0101_0101,
|
||||||
|
0b1010_1010_1010_1010_1010,
|
||||||
|
0b0101_0101_0101_0101_0101,
|
||||||
|
0b1010_1010_1010_1010_1010,
|
||||||
|
0b0101_0101_0101_0101_0101,
|
||||||
|
0b1010_1010_1010_1010_1010,
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
if *cx.local.pattern {
|
||||||
|
cx.local.led_pin.set_high().unwrap();
|
||||||
|
} else {
|
||||||
|
cx.local.led_pin.set_low().unwrap();
|
||||||
|
}
|
||||||
|
*cx.local.pattern = !*cx.local.pattern;
|
||||||
|
|
||||||
write_display(
|
write_display(
|
||||||
&pattern2,
|
&pattern,
|
||||||
&mut col_clock_pin,
|
cx.local.col_clock_pin,
|
||||||
&mut col_data_pin,
|
cx.local.col_data_pin,
|
||||||
&mut row_clock_pin,
|
cx.local.row_clock_pin,
|
||||||
&mut row_data_pin,
|
cx.local.row_data_pin,
|
||||||
&mut strobe_pin,
|
cx.local.strobe_pin,
|
||||||
&mut white_pin,
|
cx.local.white_pin,
|
||||||
&mut black_pin,
|
cx.local.black_pin,
|
||||||
&mut delay,
|
cx.local.delay,
|
||||||
);
|
);
|
||||||
delay.delay_ms(1000);
|
|
||||||
|
update_display::spawn_after(1.secs()).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// End of file
|
|
||||||
|
|
Loading…
Reference in New Issue