mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-01-07 22:10:57 +00:00
feat(core): expose BLE functionality to rust
[no changelog]
This commit is contained in:
parent
0afb5caca3
commit
b4cbebde66
@ -40,6 +40,7 @@ rgb_led = []
|
|||||||
backlight = []
|
backlight = []
|
||||||
usb = []
|
usb = []
|
||||||
optiga = []
|
optiga = []
|
||||||
|
ble = []
|
||||||
translations = ["crypto"]
|
translations = ["crypto"]
|
||||||
test = [
|
test = [
|
||||||
"backlight",
|
"backlight",
|
||||||
|
@ -408,6 +408,11 @@ fn generate_trezorhal_bindings() {
|
|||||||
//usb
|
//usb
|
||||||
.allowlist_type("usb_event_t")
|
.allowlist_type("usb_event_t")
|
||||||
.allowlist_function("usb_get_state")
|
.allowlist_function("usb_get_state")
|
||||||
|
// ble
|
||||||
|
.allowlist_function("ble_get_state")
|
||||||
|
.allowlist_function("ble_issue_command")
|
||||||
|
.allowlist_type("ble_command_t")
|
||||||
|
.allowlist_type("ble_state_t")
|
||||||
// touch
|
// touch
|
||||||
.allowlist_function("touch_get_event")
|
.allowlist_function("touch_get_event")
|
||||||
// button
|
// button
|
||||||
|
@ -124,6 +124,7 @@ static void _librust_qstrs(void) {
|
|||||||
MP_QSTR_bitcoin__unverified_external_inputs;
|
MP_QSTR_bitcoin__unverified_external_inputs;
|
||||||
MP_QSTR_bitcoin__valid_signature;
|
MP_QSTR_bitcoin__valid_signature;
|
||||||
MP_QSTR_bitcoin__voting_rights;
|
MP_QSTR_bitcoin__voting_rights;
|
||||||
|
MP_QSTR_ble_event;
|
||||||
MP_QSTR_bootscreen;
|
MP_QSTR_bootscreen;
|
||||||
MP_QSTR_br_code;
|
MP_QSTR_br_code;
|
||||||
MP_QSTR_br_name;
|
MP_QSTR_br_name;
|
||||||
|
31
core/embed/rust/src/trezorhal/ble.rs
Normal file
31
core/embed/rust/src/trezorhal/ble.rs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
use super::ffi;
|
||||||
|
|
||||||
|
pub fn connected() -> bool {
|
||||||
|
unsafe {
|
||||||
|
let mut state = ffi::ble_state_t {
|
||||||
|
connected: false,
|
||||||
|
peer_count: 0,
|
||||||
|
};
|
||||||
|
ffi::ble_get_state(&mut state as _);
|
||||||
|
|
||||||
|
state.connected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn pairing_mode() {
|
||||||
|
unsafe {
|
||||||
|
ffi::ble_issue_command(ffi::ble_command_t_BLE_PAIRING_MODE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn allow_pairing() {
|
||||||
|
unsafe {
|
||||||
|
ffi::ble_issue_command(ffi::ble_command_t_BLE_ALLOW_PAIRING);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reject_pairing() {
|
||||||
|
unsafe {
|
||||||
|
ffi::ble_issue_command(ffi::ble_command_t_BLE_REJECT_PAIRING);
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,6 @@
|
|||||||
pub mod bip39;
|
pub mod bip39;
|
||||||
|
#[cfg(feature = "ble")]
|
||||||
|
pub mod ble;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
#[allow(unused_macros)]
|
#[allow(unused_macros)]
|
||||||
pub mod fatal_error;
|
pub mod fatal_error;
|
||||||
|
@ -11,6 +11,8 @@ use crate::{
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[cfg(feature = "ble")]
|
||||||
|
use crate::ui::event::BLEEvent;
|
||||||
#[cfg(feature = "button")]
|
#[cfg(feature = "button")]
|
||||||
use crate::ui::event::ButtonEvent;
|
use crate::ui::event::ButtonEvent;
|
||||||
use crate::ui::event::USBEvent;
|
use crate::ui::event::USBEvent;
|
||||||
@ -319,6 +321,8 @@ pub enum Event {
|
|||||||
Button(ButtonEvent),
|
Button(ButtonEvent),
|
||||||
#[cfg(feature = "touch")]
|
#[cfg(feature = "touch")]
|
||||||
Touch(TouchEvent),
|
Touch(TouchEvent),
|
||||||
|
#[cfg(feature = "ble")]
|
||||||
|
BLE(BLEEvent),
|
||||||
USB(USBEvent),
|
USB(USBEvent),
|
||||||
/// Previously requested timer was triggered. This invalidates the timer
|
/// Previously requested timer was triggered. This invalidates the timer
|
||||||
/// token (another timer has to be requested).
|
/// token (another timer has to be requested).
|
||||||
|
23
core/embed/rust/src/ui/event/ble.rs
Normal file
23
core/embed/rust/src/ui/event/ble.rs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
use crate::error::Error;
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, PartialEq, Eq)]
|
||||||
|
#[cfg_attr(feature = "debug", derive(ufmt::derive::uDebug))]
|
||||||
|
pub enum BLEEvent {
|
||||||
|
Connected,
|
||||||
|
Disconnected,
|
||||||
|
PairingRequest(&'static [u8]),
|
||||||
|
PairingCanceled,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BLEEvent {
|
||||||
|
pub fn new(event: u32, data: &'static [u8]) -> Result<Self, Error> {
|
||||||
|
let result = match event {
|
||||||
|
1 => Self::Connected,
|
||||||
|
2 => Self::Disconnected,
|
||||||
|
3 => Self::PairingRequest(data),
|
||||||
|
4 => Self::PairingCanceled,
|
||||||
|
_ => return Err(Error::OutOfRange),
|
||||||
|
};
|
||||||
|
Ok(result)
|
||||||
|
}
|
||||||
|
}
|
@ -5,6 +5,11 @@ pub mod touch;
|
|||||||
|
|
||||||
pub mod usb;
|
pub mod usb;
|
||||||
|
|
||||||
|
#[cfg(feature = "ble")]
|
||||||
|
mod ble;
|
||||||
|
|
||||||
|
#[cfg(feature = "ble")]
|
||||||
|
pub use ble::BLEEvent;
|
||||||
#[cfg(feature = "button")]
|
#[cfg(feature = "button")]
|
||||||
pub use button::{ButtonEvent, PhysicalButton};
|
pub use button::{ButtonEvent, PhysicalButton};
|
||||||
#[cfg(feature = "touch")]
|
#[cfg(feature = "touch")]
|
||||||
|
@ -7,6 +7,8 @@ use core::{
|
|||||||
#[cfg(feature = "touch")]
|
#[cfg(feature = "touch")]
|
||||||
use num_traits::{FromPrimitive, ToPrimitive};
|
use num_traits::{FromPrimitive, ToPrimitive};
|
||||||
|
|
||||||
|
#[cfg(feature = "ble")]
|
||||||
|
use crate::ui::event::BLEEvent;
|
||||||
#[cfg(feature = "button")]
|
#[cfg(feature = "button")]
|
||||||
use crate::ui::event::ButtonEvent;
|
use crate::ui::event::ButtonEvent;
|
||||||
|
|
||||||
@ -18,7 +20,7 @@ use crate::{
|
|||||||
error::Error,
|
error::Error,
|
||||||
maybe_trace::MaybeTrace,
|
maybe_trace::MaybeTrace,
|
||||||
micropython::{
|
micropython::{
|
||||||
buffer::StrBuffer,
|
buffer::{get_buffer, StrBuffer},
|
||||||
gc::{self, Gc, GcBox},
|
gc::{self, Gc, GcBox},
|
||||||
macros::{obj_dict, obj_fn_1, obj_fn_2, obj_fn_3, obj_fn_var, obj_map, obj_type},
|
macros::{obj_dict, obj_fn_1, obj_fn_2, obj_fn_3, obj_fn_var, obj_map, obj_type},
|
||||||
map::Map,
|
map::Map,
|
||||||
@ -389,6 +391,7 @@ impl LayoutObj {
|
|||||||
Qstr::MP_QSTR_button_event => obj_fn_var!(3, 3, ui_layout_button_event).as_obj(),
|
Qstr::MP_QSTR_button_event => obj_fn_var!(3, 3, ui_layout_button_event).as_obj(),
|
||||||
Qstr::MP_QSTR_progress_event => obj_fn_var!(3, 3, ui_layout_progress_event).as_obj(),
|
Qstr::MP_QSTR_progress_event => obj_fn_var!(3, 3, ui_layout_progress_event).as_obj(),
|
||||||
Qstr::MP_QSTR_usb_event => obj_fn_var!(2, 2, ui_layout_usb_event).as_obj(),
|
Qstr::MP_QSTR_usb_event => obj_fn_var!(2, 2, ui_layout_usb_event).as_obj(),
|
||||||
|
Qstr::MP_QSTR_ble_event=> obj_fn_var!(3, 3, ui_layout_ble_event).as_obj(),
|
||||||
Qstr::MP_QSTR_timer => obj_fn_2!(ui_layout_timer).as_obj(),
|
Qstr::MP_QSTR_timer => obj_fn_2!(ui_layout_timer).as_obj(),
|
||||||
Qstr::MP_QSTR_paint => obj_fn_1!(ui_layout_paint).as_obj(),
|
Qstr::MP_QSTR_paint => obj_fn_1!(ui_layout_paint).as_obj(),
|
||||||
Qstr::MP_QSTR_request_complete_repaint => obj_fn_1!(ui_layout_request_complete_repaint).as_obj(),
|
Qstr::MP_QSTR_request_complete_repaint => obj_fn_1!(ui_layout_request_complete_repaint).as_obj(),
|
||||||
@ -523,6 +526,31 @@ extern "C" fn ui_layout_button_event(_n_args: usize, _args: *const Obj) -> Obj {
|
|||||||
Obj::const_none()
|
Obj::const_none()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "ble")]
|
||||||
|
extern "C" fn ui_layout_ble_event(n_args: usize, args: *const Obj) -> Obj {
|
||||||
|
let block = |args: &[Obj], _kwargs: &Map| {
|
||||||
|
if args.len() != 3 {
|
||||||
|
return Err(Error::TypeError);
|
||||||
|
}
|
||||||
|
let this: Gc<LayoutObj> = args[0].try_into()?;
|
||||||
|
let data: Obj = args[2].try_into()?;
|
||||||
|
|
||||||
|
let data = unsafe { get_buffer(data) };
|
||||||
|
|
||||||
|
let data = unwrap!(data);
|
||||||
|
|
||||||
|
let event = BLEEvent::new(args[1].try_into()?, data)?;
|
||||||
|
let msg = this.inner_mut().obj_event(Event::BLE(event))?;
|
||||||
|
Ok(msg)
|
||||||
|
};
|
||||||
|
unsafe { util::try_with_args_and_kwargs(n_args, args, &Map::EMPTY, block) }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(feature = "ble"))]
|
||||||
|
extern "C" fn ui_layout_ble_event(_n_args: usize, _args: *const Obj) -> Obj {
|
||||||
|
Obj::const_none()
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" fn ui_layout_progress_event(n_args: usize, args: *const Obj) -> Obj {
|
extern "C" fn ui_layout_progress_event(n_args: usize, args: *const Obj) -> Obj {
|
||||||
let block = |args: &[Obj], _kwargs: &Map| {
|
let block = |args: &[Obj], _kwargs: &Map| {
|
||||||
if args.len() != 3 {
|
if args.len() != 3 {
|
||||||
|
@ -11,6 +11,10 @@
|
|||||||
#include <util/translations.h>
|
#include <util/translations.h>
|
||||||
#include "storage.h"
|
#include "storage.h"
|
||||||
|
|
||||||
|
#ifdef USE_BLE
|
||||||
|
#include <io/ble.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef USE_BUTTON
|
#ifdef USE_BUTTON
|
||||||
#include <io/button.h>
|
#include <io/button.h>
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user