1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-02-05 20:31:01 +00:00

feat(core): add power button to button driver

[no changelog]
This commit is contained in:
tychovrahe 2024-10-01 10:46:07 +02:00 committed by TychoVrahe
parent 0f8a2955ec
commit 435fbd6e8c
13 changed files with 181 additions and 48 deletions

View File

@ -169,13 +169,13 @@ void ui_click(void) {
void ui_click(void) { void ui_click(void) {
for (;;) { for (;;) {
button_read(); button_read();
if (button_state_left() != 0 && button_state_right() != 0) { if (button_state(BTN_LEFT) != 0 && button_state(BTN_RIGHT) != 0) {
break; break;
} }
} }
for (;;) { for (;;) {
button_read(); button_read();
if (button_state_left() != 1 && button_state_right() != 1) { if (button_state(BTN_LEFT) != 1 && button_state(BTN_RIGHT) != 1) {
break; break;
} }
} }

View File

@ -524,7 +524,7 @@ int bootloader_main(void) {
} }
#elif defined USE_BUTTON #elif defined USE_BUTTON
button_read(); button_read();
if (button_state_left() == 1) { if (button_state(BTN_LEFT) == 1) {
touched = 1; touched = 1;
} }
#endif #endif

View File

@ -8,6 +8,9 @@
#define ORIENTATION_NS 1 #define ORIENTATION_NS 1
#define BTN_LEFT_KEY SDLK_LEFT
#define BTN_RIGHT_KEY SDLK_RIGHT
#define BACKGROUND_FILE "T2B1/background_T2B1.h" #define BACKGROUND_FILE "T2B1/background_T2B1.h"
#define BACKGROUND_NAME background_T2B1_png #define BACKGROUND_NAME background_T2B1_png

View File

@ -8,6 +8,9 @@
#define ORIENTATION_NS 1 #define ORIENTATION_NS 1
#define BTN_LEFT_KEY SDLK_LEFT
#define BTN_RIGHT_KEY SDLK_RIGHT
#define BACKGROUND_FILE "T2B1/background_T2B1.h" #define BACKGROUND_FILE "T2B1/background_T2B1.h"
#define BACKGROUND_NAME background_T2B1_png #define BACKGROUND_NAME background_T2B1_png

View File

@ -6,6 +6,8 @@
#define TOUCH_OFFSET_X 80 #define TOUCH_OFFSET_X 80
#define TOUCH_OFFSET_Y 102 #define TOUCH_OFFSET_Y 102
#define BTN_POWER_KEY SDLK_p
#define ORIENTATION_NS 1 #define ORIENTATION_NS 1
// #define BACKGROUND_FILE "T3W1/background_T3W1.h" // #define BACKGROUND_FILE "T3W1/background_T3W1.h"

View File

@ -450,6 +450,7 @@ fn generate_trezorhal_bindings() {
// touch // touch
.allowlist_function("touch_get_event") .allowlist_function("touch_get_event")
// button // button
.allowlist_type("button_t")
.allowlist_function("button_read") .allowlist_function("button_read")
// haptic // haptic
.allowlist_type("haptic_effect_t") .allowlist_type("haptic_effect_t")

View File

@ -9,3 +9,12 @@ pub fn io_touch_get_event() -> u32 {
pub fn io_button_read() -> u32 { pub fn io_button_read() -> u32 {
unsafe { ffi::button_read() } unsafe { ffi::button_read() }
} }
#[cfg(feature = "button")]
#[derive(Copy, Clone, PartialEq, Eq, FromPrimitive)]
#[cfg_attr(feature = "debug", derive(ufmt::derive::uDebug))]
pub enum PhysicalButton {
Left = ffi::button_t_BTN_LEFT as _,
Right = ffi::button_t_BTN_RIGHT as _,
Power = ffi::button_t_BTN_POWER as _,
}

View File

@ -1,11 +1,7 @@
use crate::error::Error; use crate::error::Error;
use num_traits::FromPrimitive;
#[derive(Copy, Clone, PartialEq, Eq)] pub use crate::trezorhal::io::PhysicalButton;
#[cfg_attr(feature = "debug", derive(ufmt::derive::uDebug))]
pub enum PhysicalButton {
Left,
Right,
}
#[derive(Copy, Clone, PartialEq, Eq)] #[derive(Copy, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "debug", derive(ufmt::derive::uDebug))] #[cfg_attr(feature = "debug", derive(ufmt::derive::uDebug))]
@ -22,12 +18,11 @@ pub enum ButtonEvent {
impl ButtonEvent { impl ButtonEvent {
pub fn new(event: u32, button: u32) -> Result<Self, Error> { pub fn new(event: u32, button: u32) -> Result<Self, Error> {
let button = match button { let button = PhysicalButton::from_u32(button);
0 => PhysicalButton::Left,
1 => PhysicalButton::Right, let button = button.ok_or(Error::OutOfRange)?;
_ => return Err(Error::OutOfRange),
}; let result = match event & 0xFF {
let result = match event {
1 => Self::ButtonPressed(button), 1 => Self::ButtonPressed(button),
2 => Self::ButtonReleased(button), 2 => Self::ButtonReleased(button),
_ => return Err(Error::OutOfRange), _ => return Err(Error::OutOfRange),

View File

@ -28,6 +28,7 @@ impl From<PhysicalButton> for ButtonPos {
match btn { match btn {
PhysicalButton::Left => ButtonPos::Left, PhysicalButton::Left => ButtonPos::Left,
PhysicalButton::Right => ButtonPos::Right, PhysicalButton::Right => ButtonPos::Right,
_ => fatal_error!("unsupported button"),
} }
} }
} }

View File

@ -439,6 +439,7 @@ impl Component for ButtonController {
self.right_btn.hold_started(ctx); self.right_btn.hold_started(ctx);
Some(ButtonControllerMsg::Pressed(ButtonPos::Right)) Some(ButtonControllerMsg::Pressed(ButtonPos::Right))
} }
_ => None,
}, },
) )
} }
@ -465,6 +466,7 @@ impl Component for ButtonController {
// _ _ // _ _
(ButtonState::Nothing, self.right_btn.maybe_trigger(ctx)) (ButtonState::Nothing, self.right_btn.maybe_trigger(ctx))
} }
_ => (ButtonState::Nothing, None),
}, },
// * ▼ | ▼ * // * ▼ | ▼ *
ButtonEvent::ButtonPressed(b) if b != which_down => { ButtonEvent::ButtonPressed(b) if b != which_down => {
@ -562,6 +564,7 @@ impl Component for ButtonController {
PhysicalButton::Right => { PhysicalButton::Right => {
self.set_pressed(ctx, false, false, true); self.set_pressed(ctx, false, false, true);
} }
_ => {}
}, },
ButtonState::BothDown | ButtonState::OneReleased(_) => { ButtonState::BothDown | ButtonState::OneReleased(_) => {
self.set_pressed(ctx, false, true, false); self.set_pressed(ctx, false, true, false);

View File

@ -25,17 +25,15 @@
#define BTN_EVT_DOWN (1U << 24) #define BTN_EVT_DOWN (1U << 24)
#define BTN_EVT_UP (1U << 25) #define BTN_EVT_UP (1U << 25)
#define BTN_LEFT 0 typedef enum {
#define BTN_RIGHT 1 BTN_LEFT = 0,
BTN_RIGHT = 1,
#ifdef KERNEL_MODE BTN_POWER = 2,
} button_t;
void button_init(void); void button_init(void);
#endif
uint32_t button_read(void); uint32_t button_read(void);
char button_state_left(void);
char button_state_right(void); bool button_state(button_t button);
#endif #endif

View File

@ -6,27 +6,51 @@
#ifdef KERNEL_MODE #ifdef KERNEL_MODE
static char last_left = 0, last_right = 0; static void init_btn(GPIO_TypeDef *port, uint16_t pin) {
GPIO_InitTypeDef GPIO_InitStructure;
void button_init(void) {
BTN_LEFT_CLK_ENA();
BTN_RIGHT_CLK_ENA();
GPIO_InitTypeDef GPIO_InitStructure = {0};
GPIO_InitStructure.Mode = GPIO_MODE_INPUT; GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
GPIO_InitStructure.Pull = GPIO_PULLUP; GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStructure.Pin = BTN_LEFT_PIN; GPIO_InitStructure.Pin = pin;
HAL_GPIO_Init(BTN_LEFT_PORT, &GPIO_InitStructure); HAL_GPIO_Init(port, &GPIO_InitStructure);
GPIO_InitStructure.Pin = BTN_RIGHT_PIN; }
HAL_GPIO_Init(BTN_RIGHT_PORT, &GPIO_InitStructure);
#ifdef BTN_LEFT_CLK_ENA
static bool last_left = 0;
bool button_state_left(void) { return last_left; }
#endif
#ifdef BTN_RIGHT_CLK_ENA
static bool last_right = 0;
bool button_state_right(void) { return last_right; }
#endif
#ifdef BTN_POWER_CLK_ENA
static bool last_power = 0;
bool button_state_power(void) { return last_power; }
#endif
void button_init(void) {
#ifdef BTN_LEFT_CLK_ENA
BTN_LEFT_CLK_ENA();
init_btn(BTN_LEFT_PORT, BTN_LEFT_PIN);
#endif
#ifdef BTN_RIGHT_CLK_ENA
BTN_RIGHT_CLK_ENA();
init_btn(BTN_RIGHT_PORT, BTN_RIGHT_PIN);
#endif
#ifdef BTN_POWER_CLK_ENA
BTN_POWER_CLK_ENA();
init_btn(BTN_POWER_PORT, BTN_POWER_PIN);
#endif
} }
uint32_t button_read(void) { uint32_t button_read(void) {
char left = (GPIO_PIN_RESET == HAL_GPIO_ReadPin(BTN_LEFT_PORT, BTN_LEFT_PIN)); #ifdef BTN_LEFT_CLK_ENA
char right = bool left = (GPIO_PIN_RESET == HAL_GPIO_ReadPin(BTN_LEFT_PORT, BTN_LEFT_PIN));
(GPIO_PIN_RESET == HAL_GPIO_ReadPin(BTN_RIGHT_PORT, BTN_RIGHT_PIN));
if (last_left != left) { if (last_left != left) {
last_left = left; last_left = left;
if (left) { if (left) {
@ -35,6 +59,10 @@ uint32_t button_read(void) {
return BTN_EVT_UP | BTN_LEFT; return BTN_EVT_UP | BTN_LEFT;
} }
} }
#endif
#ifdef BTN_RIGHT_CLK_ENA
bool right =
(GPIO_PIN_RESET == HAL_GPIO_ReadPin(BTN_RIGHT_PORT, BTN_RIGHT_PIN));
if (last_right != right) { if (last_right != right) {
last_right = right; last_right = right;
if (right) { if (right) {
@ -43,11 +71,40 @@ uint32_t button_read(void) {
return BTN_EVT_UP | BTN_RIGHT; return BTN_EVT_UP | BTN_RIGHT;
} }
} }
#endif
#ifdef BTN_POWER_CLK_ENA
bool power =
(GPIO_PIN_RESET == HAL_GPIO_ReadPin(BTN_POWER_PORT, BTN_POWER_PIN));
if (last_power != power) {
last_power = power;
if (power) {
return BTN_EVT_DOWN | BTN_POWER;
} else {
return BTN_EVT_UP | BTN_POWER;
}
}
#endif
return 0; return 0;
} }
char button_state_left(void) { return last_left; } bool button_state(button_t button) {
switch (button) {
char button_state_right(void) { return last_right; } #ifdef BTN_LEFT_CLK_ENA
case BTN_LEFT:
return button_state_left();
#endif
#ifdef BTN_RIGHT_CLK_ENA
case BTN_RIGHT:
return button_state_right();
#endif
#ifdef BTN_POWER_CLK_ENA
case BTN_POWER:
return button_state_power();
#endif
default:
return false;
}
}
#endif // KERNEL_MODE #endif // KERNEL_MODE

View File

@ -24,11 +24,48 @@
#include "button.h" #include "button.h"
static char last_left = 0, last_right = 0; #ifdef BTN_LEFT_KEY
static bool last_left = 0;
#endif
char button_state_left(void) { return last_left; } #ifdef BTN_RIGHT_KEY
static bool last_right = 0;
#endif
char button_state_right(void) { return last_right; } #ifdef BTN_POWER_KEY
static bool last_power = 0;
#endif
#ifdef BTN_LEFT_KEY
bool button_state_left(void) { return last_left; }
#endif
#ifdef BTN_RIGHT_KEY
bool button_state_right(void) { return last_right; }
#endif
#ifdef BTN_POWER_KEY
bool button_state_power(void) { return last_power; }
#endif
bool button_state(button_t button) {
switch (button) {
#ifdef BTN_LEFT_KEY
case BTN_LEFT:
return button_state_left();
#endif
#ifdef BTN_RIGHT_KEY
case BTN_RIGHT:
return button_state_right();
#endif
#ifdef BTN_POWER_KEY
case BTN_POWER:
return button_state_power();
#endif
default:
return false;
}
}
uint32_t button_read(void) { uint32_t button_read(void) {
SDL_Event event; SDL_Event event;
@ -39,12 +76,23 @@ uint32_t button_read(void) {
break; break;
} }
switch (event.key.keysym.sym) { switch (event.key.keysym.sym) {
case SDLK_LEFT: #ifdef BTN_LEFT_KEY
case BTN_LEFT_KEY:
last_left = 1; last_left = 1;
return BTN_EVT_DOWN | BTN_LEFT; return BTN_EVT_DOWN | BTN_LEFT;
case SDLK_RIGHT: #endif
#ifdef BTN_RIGHT_KEY
case BTN_RIGHT_KEY:
last_right = 1; last_right = 1;
return BTN_EVT_DOWN | BTN_RIGHT; return BTN_EVT_DOWN | BTN_RIGHT;
#endif
#ifdef BTN_POWER_KEY
case BTN_POWER_KEY:
last_power = 1;
return BTN_EVT_DOWN | BTN_POWER;
#endif
default:
break;
} }
break; break;
case SDL_KEYUP: case SDL_KEYUP:
@ -52,14 +100,27 @@ uint32_t button_read(void) {
break; break;
} }
switch (event.key.keysym.sym) { switch (event.key.keysym.sym) {
case SDLK_LEFT: #ifdef BTN_LEFT_KEY
case BTN_LEFT_KEY:
last_left = 0; last_left = 0;
return BTN_EVT_UP | BTN_LEFT; return BTN_EVT_UP | BTN_LEFT;
case SDLK_RIGHT: #endif
#ifdef BTN_RIGHT_KEY
case BTN_RIGHT_KEY:
last_right = 0; last_right = 0;
return BTN_EVT_UP | BTN_RIGHT; return BTN_EVT_UP | BTN_RIGHT;
#endif
#ifdef BTN_POWER_KEY
case BTN_POWER_KEY:
last_power = 0;
return BTN_EVT_UP | BTN_POWER;
#endif
default:
break;
} }
break; break;
default:
break;
} }
} }
return 0; return 0;