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:
parent
0f8a2955ec
commit
435fbd6e8c
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
@ -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")
|
||||||
|
@ -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 _,
|
||||||
|
}
|
||||||
|
@ -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),
|
||||||
|
@ -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"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user