Skip to content

Commit 43b76a5

Browse files
committed
feat(macro): migrate macro to TrouBLE, fix errors
Signed-off-by: Haobo Gu <[email protected]>
1 parent 754ba6d commit 43b76a5

File tree

7 files changed

+202
-137
lines changed

7 files changed

+202
-137
lines changed

rmk-macro/src/bind_interrupt.rs

Lines changed: 75 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -36,96 +36,95 @@ pub(crate) fn expand_bind_interrupt(keyboard_config: &KeyboardConfig, item_mod:
3636
}
3737

3838
pub(crate) fn bind_interrupt_default(keyboard_config: &KeyboardConfig) -> TokenStream2 {
39-
if let Some(usb_info) = keyboard_config.communication.get_usb_info() {
40-
let interrupt_name = format_ident!("{}", usb_info.interrupt_name);
41-
let peripheral_name = format_ident!("{}", usb_info.peripheral_name);
42-
match keyboard_config.chip.series {
43-
crate::ChipSeries::Stm32 => {
44-
if !keyboard_config.chip.has_usb() {
45-
return quote! {};
46-
}
47-
39+
match keyboard_config.chip.series {
40+
crate::ChipSeries::Stm32 => {
41+
if let Some(usb_info) = keyboard_config.communication.get_usb_info() {
42+
let interrupt_name = format_ident!("{}", usb_info.interrupt_name);
43+
let peripheral_name = format_ident!("{}", usb_info.peripheral_name);
4844
quote! {
4945
use ::embassy_stm32::bind_interrupts;
5046
bind_interrupts!(struct Irqs {
5147
#interrupt_name => ::embassy_stm32::usb::InterruptHandler<::embassy_stm32::peripherals::#peripheral_name>;
5248
});
5349
}
50+
} else {
51+
quote! {}
5452
}
55-
crate::ChipSeries::Nrf52 => {
56-
let saadc_interrupt = if let Some(BleConfig {
57-
enabled: true,
58-
battery_adc_pin: Some(_adc_pin),
59-
charge_state: _,
60-
charge_led: _,
61-
adc_divider_measured: _,
62-
adc_divider_total: _,
63-
}) = keyboard_config.communication.get_ble_config()
64-
{
65-
Some(quote! {
66-
SAADC => ::embassy_nrf::saadc::InterruptHandler;
67-
})
68-
} else {
69-
None
70-
};
71-
let interrupt_binding = if keyboard_config.chip.has_usb() {
72-
quote! {
73-
#interrupt_name => ::embassy_nrf::usb::InterruptHandler<::embassy_nrf::peripherals::#peripheral_name>;
74-
#saadc_interrupt
75-
RNG => ::embassy_nrf::rng::InterruptHandler<::embassy_nrf::peripherals::RNG>;
76-
EGU0_SWI0 => ::nrf_sdc::mpsl::LowPrioInterruptHandler;
77-
CLOCK_POWER => ::nrf_sdc::mpsl::ClockInterruptHandler, ::embassy_nrf::usb::vbus_detect::InterruptHandler;
78-
RADIO => ::nrf_sdc::mpsl::HighPrioInterruptHandler;
79-
TIMER0 => ::nrf_sdc::mpsl::HighPrioInterruptHandler;
80-
RTC0 => ::nrf_sdc::mpsl::HighPrioInterruptHandler;
81-
}
82-
} else {
83-
quote! { #saadc_interrupt }
84-
};
53+
}
54+
crate::ChipSeries::Nrf52 => {
55+
let saadc_interrupt = if let Some(BleConfig {
56+
enabled: true,
57+
battery_adc_pin: Some(_adc_pin),
58+
charge_state: _,
59+
charge_led: _,
60+
adc_divider_measured: _,
61+
adc_divider_total: _,
62+
}) = keyboard_config.communication.get_ble_config()
63+
{
64+
quote! { SAADC => ::embassy_nrf::saadc::InterruptHandler; }
65+
} else {
66+
quote! {}
67+
};
68+
let usb_and_clock_interrupt = if let Some(usb_info) = keyboard_config.communication.get_usb_info() {
69+
let interrupt_name = format_ident!("{}", usb_info.interrupt_name);
70+
let peripheral_name = format_ident!("{}", usb_info.peripheral_name);
8571
quote! {
86-
use ::embassy_nrf::bind_interrupts;
87-
bind_interrupts!(struct Irqs {
88-
#interrupt_binding
89-
});
72+
#interrupt_name => ::embassy_nrf::usb::InterruptHandler<::embassy_nrf::peripherals::#peripheral_name>;
73+
CLOCK_POWER => ::nrf_sdc::mpsl::ClockInterruptHandler, ::embassy_nrf::usb::vbus_detect::InterruptHandler;
74+
}
75+
} else {
76+
quote! { CLOCK_POWER => ::nrf_sdc::mpsl::ClockInterruptHandler; }
77+
};
78+
quote! {
79+
use ::embassy_nrf::bind_interrupts;
80+
bind_interrupts!(struct Irqs {
81+
#saadc_interrupt
82+
#usb_and_clock_interrupt
83+
RNG => ::embassy_nrf::rng::InterruptHandler<::embassy_nrf::peripherals::RNG>;
84+
EGU0_SWI0 => ::nrf_sdc::mpsl::LowPrioInterruptHandler;
85+
RADIO => ::nrf_sdc::mpsl::HighPrioInterruptHandler;
86+
TIMER0 => ::nrf_sdc::mpsl::HighPrioInterruptHandler;
87+
RTC0 => ::nrf_sdc::mpsl::HighPrioInterruptHandler;
88+
});
9089

91-
#[::embassy_executor::task]
92-
async fn mpsl_task(mpsl: &'static ::nrf_sdc::mpsl::MultiprotocolServiceLayer<'static>) -> ! {
93-
mpsl.run().await
94-
}
95-
/// How many outgoing L2CAP buffers per link
96-
const L2CAP_TXQ: u8 = 3;
90+
#[::embassy_executor::task]
91+
async fn mpsl_task(mpsl: &'static ::nrf_sdc::mpsl::MultiprotocolServiceLayer<'static>) -> ! {
92+
mpsl.run().await
93+
}
94+
/// How many outgoing L2CAP buffers per link
95+
const L2CAP_TXQ: u8 = 3;
9796

98-
/// How many incoming L2CAP buffers per link
99-
const L2CAP_RXQ: u8 = 3;
97+
/// How many incoming L2CAP buffers per link
98+
const L2CAP_RXQ: u8 = 3;
10099

101-
/// Size of L2CAP packets
102-
const L2CAP_MTU: usize = 72;
103-
fn build_sdc<'d, const N: usize>(
104-
p: ::nrf_sdc::Peripherals<'d>,
105-
rng: &'d mut ::embassy_nrf::rng::Rng<::embassy_nrf::peripherals::RNG>,
106-
mpsl: &'d ::nrf_sdc::mpsl::MultiprotocolServiceLayer,
107-
mem: &'d mut ::nrf_sdc::Mem<N>,
108-
) -> Result<::nrf_sdc::SoftdeviceController<'d>, ::nrf_sdc::Error> {
109-
::nrf_sdc::Builder::new()?
110-
.support_adv()?
111-
.support_peripheral()?
112-
.peripheral_count(1)?
113-
.buffer_cfg(L2CAP_MTU as u8, L2CAP_MTU as u8, L2CAP_TXQ, L2CAP_RXQ)?
114-
.build(p, rng, mpsl, mem)
115-
}
100+
/// Size of L2CAP packets
101+
const L2CAP_MTU: usize = 72;
102+
fn build_sdc<'d, const N: usize>(
103+
p: ::nrf_sdc::Peripherals<'d>,
104+
rng: &'d mut ::embassy_nrf::rng::Rng<::embassy_nrf::peripherals::RNG>,
105+
mpsl: &'d ::nrf_sdc::mpsl::MultiprotocolServiceLayer,
106+
mem: &'d mut ::nrf_sdc::Mem<N>,
107+
) -> Result<::nrf_sdc::SoftdeviceController<'d>, ::nrf_sdc::Error> {
108+
::nrf_sdc::Builder::new()?
109+
.support_adv()?
110+
.support_peripheral()?
111+
.peripheral_count(1)?
112+
.buffer_cfg(L2CAP_MTU as u8, L2CAP_MTU as u8, L2CAP_TXQ, L2CAP_RXQ)?
113+
.build(p, rng, mpsl, mem)
116114
}
117115
}
118-
crate::ChipSeries::Rp2040 => {
119-
quote! {
120-
use ::embassy_rp::bind_interrupts;
121-
bind_interrupts!(struct Irqs {
122-
#interrupt_name => ::embassy_rp::usb::InterruptHandler<::embassy_rp::peripherals::#peripheral_name>;
123-
});
124-
}
116+
}
117+
crate::ChipSeries::Rp2040 => {
118+
let usb_info = keyboard_config.communication.get_usb_info().unwrap();
119+
let interrupt_name = format_ident!("{}", usb_info.interrupt_name);
120+
let peripheral_name = format_ident!("{}", usb_info.peripheral_name);
121+
quote! {
122+
use ::embassy_rp::bind_interrupts;
123+
bind_interrupts!(struct Irqs {
124+
#interrupt_name => ::embassy_rp::usb::InterruptHandler<::embassy_rp::peripherals::#peripheral_name>;
125+
});
125126
}
126-
crate::ChipSeries::Esp32 => quote! {},
127127
}
128-
} else {
129-
quote! {}
128+
crate::ChipSeries::Esp32 => quote! {},
130129
}
131130
}

rmk-macro/src/chip_init.rs

Lines changed: 52 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,18 @@ use quote::{quote, ToTokens};
44
use syn::{ItemFn, ItemMod};
55

66
use crate::keyboard::Overwritten;
7-
use crate::keyboard_config::KeyboardConfig;
7+
use crate::keyboard_config::{BoardConfig, CommunicationConfig, KeyboardConfig};
88
use crate::{ChipModel, ChipSeries};
99

1010
// Default implementations of chip initialization
11-
pub(crate) fn chip_init_default(chip: &ChipModel) -> TokenStream2 {
12-
match chip.series {
11+
pub(crate) fn chip_init_default(keyboard_config: &KeyboardConfig) -> TokenStream2 {
12+
match keyboard_config.chip.series {
1313
ChipSeries::Stm32 => quote! {
1414
let config = ::embassy_stm32::Config::default();
1515
let mut p = ::embassy_stm32::init(config);
1616
},
1717
ChipSeries::Nrf52 => {
18-
let dcdc_config = if chip.chip == "nrf52840" {
18+
let dcdc_config = if keyboard_config.chip.chip == "nrf52840" {
1919
quote! {
2020
config.dcdc.reg0_voltage = Some(::embassy_nrf::config::Reg0Voltage::_3v3);
2121
config.dcdc.reg0 = true;
@@ -24,12 +24,10 @@ pub(crate) fn chip_init_default(chip: &ChipModel) -> TokenStream2 {
2424
} else {
2525
quote! {}
2626
};
27-
quote! {
28-
use embassy_nrf::interrupt::InterruptExt;
29-
let mut config = ::embassy_nrf::config::Config::default();
30-
#dcdc_config
31-
::embassy_nrf::interrupt::CLOCK_POWER.set_priority(::embassy_nrf::interrupt::Priority::P2);
32-
let p = ::embassy_nrf::init(config);
27+
let ble_addr = get_ble_addr(keyboard_config).expect("No BLE address defined for nRF52");
28+
let ble_init = match &keyboard_config.communication {
29+
CommunicationConfig::Usb(_) => quote! {},
30+
CommunicationConfig::Ble(_) | CommunicationConfig::Both(_, _) => quote! {
3331
let mpsl_p = ::nrf_sdc::mpsl::Peripherals::new(p.RTC0, p.TIMER0, p.TEMP, p.PPI_CH19, p.PPI_CH30, p.PPI_CH31);
3432
let lfclk_cfg = ::nrf_sdc::mpsl::raw::mpsl_clock_lfclk_cfg_t {
3533
source: ::nrf_sdc::mpsl::raw::MPSL_CLOCK_LF_SRC_RC as u8,
@@ -56,10 +54,18 @@ pub(crate) fn chip_init_default(chip: &ChipModel) -> TokenStream2 {
5654
let mut rng_gen = ::rand_chacha::ChaCha12Rng::from_rng(&mut rng).unwrap();
5755
let mut sdc_mem = ::nrf_sdc::Mem::<4096>::new();
5856
let sdc = ::defmt::unwrap!(build_sdc(sdc_p, &mut rng, &*mpsl, &mut sdc_mem));
59-
// TODO: use central addr from config
60-
let central_addr = [0x18, 0xe2, 0x21, 0x80, 0xc0, 0xc7];
57+
let central_addr = [#(#ble_addr), *];
6158
let mut host_resources = ::rmk::HostResources::new();
6259
let stack = ::rmk::ble::trouble::build_ble_stack(sdc, central_addr, &mut rng_gen, &mut host_resources).await;
60+
},
61+
CommunicationConfig::None => quote! {},
62+
};
63+
quote! {
64+
use embassy_nrf::interrupt::InterruptExt;
65+
let mut config = ::embassy_nrf::config::Config::default();
66+
#dcdc_config
67+
let p = ::embassy_nrf::init(config);
68+
#ble_init
6369
}
6470
}
6571
ChipSeries::Rp2040 => {
@@ -68,26 +74,29 @@ pub(crate) fn chip_init_default(chip: &ChipModel) -> TokenStream2 {
6874
let p = ::embassy_rp::init(config);
6975
}
7076
}
71-
ChipSeries::Esp32 => quote! {
72-
::esp_println::logger::init_logger_from_env();
73-
let p = ::esp_hal::init({
74-
let mut config = ::esp_hal::Config::default();
75-
config.cpu_clock = ::esp_hal::clock::CpuClock::max();
76-
config
77-
});
78-
::esp_alloc::heap_allocator!(72 * 1024);
79-
let timg0 = ::esp_hal::timer::timg::TimerGroup::new(p.TIMG0);
80-
let mut rng = ::esp_hal::rng::Trng::new(p.RNG, p.ADC1);
81-
let init = ::esp_wifi::init(timg0.timer0, rng.rng.clone(), p.RADIO_CLK).unwrap();
82-
let systimer = ::esp_hal::timer::systimer::SystemTimer::new(p.SYSTIMER);
83-
::esp_hal_embassy::init(systimer.alarm0);
84-
let bluetooth = p.BT;
85-
let connector = ::esp_wifi::ble::controller::BleConnector::new(&init, bluetooth);
86-
let controller: ::bt_hci::controller::ExternalController<_, 64> = ::bt_hci::controller::ExternalController::new(connector);
87-
let central_addr = [0x18, 0xe2, 0x21, 0x80, 0xc0, 0xc7];
88-
let mut host_resources = ::rmk::HostResources::new();
89-
let stack = ::rmk::ble::trouble::build_ble_stack(controller, central_addr, &mut rng, &mut host_resources).await;
90-
},
77+
ChipSeries::Esp32 => {
78+
let ble_addr = get_ble_addr(keyboard_config).expect("No BLE address defined for ESP32");
79+
quote! {
80+
::esp_println::logger::init_logger_from_env();
81+
let p = ::esp_hal::init({
82+
let mut config = ::esp_hal::Config::default();
83+
config.cpu_clock = ::esp_hal::clock::CpuClock::max();
84+
config
85+
});
86+
::esp_alloc::heap_allocator!(72 * 1024);
87+
let timg0 = ::esp_hal::timer::timg::TimerGroup::new(p.TIMG0);
88+
let mut rng = ::esp_hal::rng::Trng::new(p.RNG, p.ADC1);
89+
let init = ::esp_wifi::init(timg0.timer0, rng.rng.clone(), p.RADIO_CLK).unwrap();
90+
let systimer = ::esp_hal::timer::systimer::SystemTimer::new(p.SYSTIMER);
91+
::esp_hal_embassy::init(systimer.alarm0);
92+
let bluetooth = p.BT;
93+
let connector = ::esp_wifi::ble::controller::BleConnector::new(&init, bluetooth);
94+
let controller: ::bt_hci::controller::ExternalController<_, 64> = ::bt_hci::controller::ExternalController::new(connector);
95+
let central_addr = [#(#ble_addr), *];
96+
let mut host_resources = ::rmk::HostResources::new();
97+
let stack = ::rmk::ble::trouble::build_ble_stack(controller, central_addr, &mut rng, &mut host_resources).await;
98+
}
99+
}
91100
}
92101
}
93102

@@ -106,9 +115,9 @@ pub(crate) fn expand_chip_init(keyboard_config: &KeyboardConfig, item_mod: &Item
106115
}
107116
None
108117
})
109-
.unwrap_or(chip_init_default(&keyboard_config.chip))
118+
.unwrap_or(chip_init_default(&keyboard_config))
110119
} else {
111-
chip_init_default(&keyboard_config.chip)
120+
chip_init_default(&keyboard_config)
112121
}
113122
}
114123

@@ -138,3 +147,12 @@ fn override_chip_init(chip: &ChipModel, item_fn: &ItemFn) -> TokenStream2 {
138147

139148
initialization_tokens
140149
}
150+
151+
fn get_ble_addr(keyboard_config: &KeyboardConfig) -> Option<[u8; 6]> {
152+
if let BoardConfig::Split(split_config) = &keyboard_config.board {
153+
split_config.central.ble_addr
154+
} else {
155+
// Default BLE random static address
156+
Some([0x18, 0xe2, 0x21, 0x80, 0xc0, 0xc7])
157+
}
158+
}

rmk-macro/src/entry.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,10 @@ pub(crate) fn rmk_entry_select(
119119
let col_offset = p.col_offset;
120120
let peripheral_ble_addr = p.ble_addr.expect("No ble_addr defined for peripheral");
121121
tasks.push(quote! {
122-
::rmk::split::central::run_peripheral_manager::<#row, #col, #row_offset, #col_offset>(
122+
::rmk::split::central::run_peripheral_manager::<#row, #col, #row_offset, #col_offset, _>(
123123
#idx,
124124
[#(#peripheral_ble_addr), *],
125+
&stack,
125126
)
126127
});
127128
});

rmk-macro/src/lib.rs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ use darling::FromMeta;
2525
use proc_macro::TokenStream;
2626
use split::peripheral::parse_split_peripheral_mod;
2727
use syn::parse_macro_input;
28-
use usb_interrupt_map::get_usb_info;
2928

3029
use crate::keyboard::parse_keyboard_mod;
3130

@@ -46,26 +45,27 @@ pub(crate) struct ChipModel {
4645
}
4746

4847
impl ChipModel {
49-
pub(crate) fn has_usb(&self) -> bool {
50-
match self.series {
51-
ChipSeries::Stm32 => get_usb_info(&self.chip).is_some(),
52-
ChipSeries::Nrf52 => {
53-
if self.chip == "nrf52833" || self.chip == "nrf52840" || self.chip == "nrf52820" {
54-
true
55-
} else {
56-
false
57-
}
58-
}
59-
ChipSeries::Rp2040 => true,
60-
ChipSeries::Esp32 => {
61-
if self.chip == "esp32s3" || self.chip == "esp32s2" {
62-
true
63-
} else {
64-
false
65-
}
66-
}
67-
}
68-
}
48+
// pub(crate) fn has_usb(&self) -> bool {
49+
// use usb_interrupt_map::get_usb_info;
50+
// match self.series {
51+
// ChipSeries::Stm32 => get_usb_info(&self.chip).is_some(),
52+
// ChipSeries::Nrf52 => {
53+
// if self.chip == "nrf52833" || self.chip == "nrf52840" || self.chip == "nrf52820" {
54+
// true
55+
// } else {
56+
// false
57+
// }
58+
// }
59+
// ChipSeries::Rp2040 => true,
60+
// ChipSeries::Esp32 => {
61+
// if self.chip == "esp32s3" || self.chip == "esp32s2" {
62+
// true
63+
// } else {
64+
// false
65+
// }
66+
// }
67+
// }
68+
// }
6969
}
7070

7171
#[proc_macro_attribute]

0 commit comments

Comments
 (0)