rp2040_rtic_smart_keyboard/
app_init.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
use rp2040_hal as hal;

use hal::pac;

use hal::clocks::ClocksManager;
use hal::timer;
use hal::timer::Alarm;
use hal::usb::UsbBus;

use rp_pico::XOSC_CRYSTAL_FREQ;

use fugit::ExtU32;

use usb_device::bus::UsbBusAllocator;
use usb_device::descriptor::lang_id::LangID;
use usb_device::device::{StringDescriptors, UsbDeviceBuilder, UsbVidPid};

use usbd_human_interface_device::usb_class::UsbHidClassBuilder;

use usbd_serial::SerialPort;

use crate::common::{UsbClass, UsbDevice};

/// Initializes the clocks.
pub fn init_clocks(
    watchdog: pac::WATCHDOG,
    xosc: pac::XOSC,
    clocks: pac::CLOCKS,
    pll_sys: pac::PLL_SYS,
    pll_usb: pac::PLL_USB,
    resets: &mut pac::RESETS,
) -> (hal::Watchdog, ClocksManager) {
    let mut watchdog = hal::Watchdog::new(watchdog);
    let clocks = hal::clocks::init_clocks_and_plls(
        XOSC_CRYSTAL_FREQ,
        xosc,
        clocks,
        pll_sys,
        pll_usb,
        resets,
        &mut watchdog,
    )
    .ok()
    .unwrap();
    (watchdog, clocks)
}

/// Initializes the timer.
pub fn init_timer(
    pac_timer: pac::TIMER,
    resets: &mut pac::RESETS,
    clocks: &ClocksManager,
) -> (timer::Timer, timer::Alarm0) {
    let mut timer = timer::Timer::new(pac_timer, resets, &clocks);
    let mut alarm = timer.alarm_0().unwrap();
    alarm.enable_interrupt();
    alarm.schedule(1.millis()).unwrap();
    (timer, alarm)
}

/// Initializes the usb device.
pub fn init_usb_device(
    usb_bus: &'static UsbBusAllocator<UsbBus>,
    vid: u16,
    pid: u16,
    mfr: &'static str,
    product: &'static str,
) -> (UsbDevice, SerialPort<'static, UsbBus>, UsbClass) {
    let usb_class = UsbHidClassBuilder::new()
        .add_device(
            usbd_human_interface_device::device::keyboard::NKROBootKeyboardConfig::default(),
        )
        .add_device(usbd_human_interface_device::device::consumer::ConsumerControlConfig::default())
        .build(usb_bus);

    let serial = SerialPort::new(&usb_bus);

    let usb_dev = UsbDeviceBuilder::new(usb_bus, UsbVidPid(vid, pid))
        .strings(&[StringDescriptors::new(LangID::EN_US)
            .manufacturer(mfr)
            .product(product)
            .serial_number(env!("CARGO_PKG_VERSION"))])
        .unwrap()
        .build();

    (usb_dev, serial, usb_class)
}