feat(core): add Tap to Wake toggle to device menu and apply at startup
What changed, and why it matters
This commit adds a user-facing 'Tap to Wake' on/off toggle to the device menu on the Trezor T3W1 hardware wallet. It stores the preference in device storage and applies it at startup and when settings are reloaded after unlocking. There is no security issue visible in the change.
No security action required. This is a feature addition for user preference management.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch extends the device menu UI (Eckhart layout only), the Rust/Python UI API, and the boot/lock-manager settings reload paths to support a new tap-to-wake setting. It introduces a ToggleTapToWake menu action, passes the current state through the UI layers, persists it inverted as _DISABLE_TAP_TO_WAKE in storage, and calls io.touch.touch_wakeup_set_enabled() in boot.py and lock_manager.reload_settings_from_storage(). Other layouts (Bolt, Caesar, Delizia) receive the new parameter but ignore it. Translation files and signatures are updated accordingly.
Changed components
core/src/apps/homescreen/device_menu.pycore/src/apps/common/lock_manager.pycore/src/boot.pycore/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rscore/embed/rust/src/ui/api/firmware_micropython.rscore/embed/rust/src/ui/layout/device_menu_result.rscore/embed/rust/src/ui/ui_firmware.rscore/embed/rust/src/ui/layout_bolt/ui_firmware.rscore/embed/rust/src/ui/layout_caesar/ui_firmware.rscore/embed/rust/src/ui/layout_delizia/ui_firmware.rscore/embed/rust/src/ui/layout_eckhart/ui_firmware.rscore/translations/en.jsoncore/translations/order.jsoncore/translations/signatures.jsoncore/embed/rust/src/translations/generated/translated_string.rscore/mocks/generated/trezorui_api.pyicore/mocks/trezortranslate_keys.pyicore/embed/rust/librust_qstr.hcore/.changelog.d/6900.addedInspect captured patch +112 / −5
diff --git a/core/.changelog.d/6900.added b/core/.changelog.d/6900.added
new file mode 100644
index 00000000..b1d2d8d9
--- /dev/null
+++ b/core/.changelog.d/6900.added
@@ -0,0 +1 @@
+[T3W1] Added Tap to Wake setting in device menu.
diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h
index 27663f3d..fbee667e 100644
--- a/core/embed/rust/librust_qstr.h
+++ b/core/embed/rust/librust_qstr.h
@@ -70,6 +70,7 @@ static void _librust_qstrs(void) {
MP_QSTR_ToggleBluetooth;
MP_QSTR_ToggleHaptics;
MP_QSTR_ToggleLed;
+ MP_QSTR_ToggleTapToWake;
MP_QSTR_TranslationsHeader;
MP_QSTR_TurnOff;
MP_QSTR_UnpairAllDevices;
@@ -861,6 +862,7 @@ static void _librust_qstrs(void) {
MP_QSTR_suite_sync__header;
MP_QSTR_suite_sync__rotate_key;
MP_QSTR_switch_off;
+ MP_QSTR_tap_to_wake_enabled;
MP_QSTR_text;
MP_QSTR_text_check;
MP_QSTR_text_confirm;
@@ -1042,6 +1044,7 @@ static void _librust_qstrs(void) {
MP_QSTR_words__sign;
MP_QSTR_words__signer;
MP_QSTR_words__swap;
+ MP_QSTR_words__tap_to_wake;
MP_QSTR_words__title_check;
MP_QSTR_words__title_done;
MP_QSTR_words__title_group;
diff --git a/core/embed/rust/src/translations/generated/translated_string.rs b/core/embed/rust/src/translations/generated/translated_string.rs
index 7e8fb64b..097e0518 100644
--- a/core/embed/rust/src/translations/generated/translated_string.rs
+++ b/core/embed/rust/src/translations/generated/translated_string.rs
@@ -1616,6 +1616,7 @@ pub enum TranslatedString {
n4w1__err_empty = 1223, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "This tag is empty. Continue to scan a different tag."}
n4w1__err_nonempty = 1224, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "Non-empty N4W1 tag."}
n4w1__err_damaged = 1225, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "This tag is damaged. Continue to try again or scan the next tag."}
+ words__tap_to_wake = 1226, // "Tap to wake"
}
impl TranslatedString {
@@ -2849,6 +2850,7 @@ impl TranslatedString {
"",
"",
"",
+ "Tap to wake",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -4080,6 +4082,7 @@ impl TranslatedString {
19800,
19800,
19800,
+ 19811,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -5310,6 +5313,7 @@ impl TranslatedString {
"",
"",
"",
+ "Tap to wake",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -6541,6 +6545,7 @@ impl TranslatedString {
19800,
19800,
19800,
+ 19811,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -7771,6 +7776,7 @@ impl TranslatedString {
"",
"",
"",
+ "Tap to wake",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -9002,6 +9008,7 @@ impl TranslatedString {
19800,
19800,
19800,
+ 19811,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -10232,6 +10239,7 @@ impl TranslatedString {
"",
"",
"",
+ "Tap to wake",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -11463,6 +11471,7 @@ impl TranslatedString {
19800,
19800,
19800,
+ 19811,
];
} else if #[cfg(feature = "layout_caesar")] {
@@ -12694,6 +12703,7 @@ impl TranslatedString {
"",
"",
"",
+ "Tap to wake",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -13925,6 +13935,7 @@ impl TranslatedString {
17734,
17734,
17734,
+ 17745,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -15155,6 +15166,7 @@ impl TranslatedString {
"",
"",
"",
+ "Tap to wake",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -16386,6 +16398,7 @@ impl TranslatedString {
17734,
17734,
17734,
+ 17745,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -17616,6 +17629,7 @@ impl TranslatedString {
"",
"",
"",
+ "Tap to wake",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -18847,6 +18861,7 @@ impl TranslatedString {
17734,
17734,
17734,
+ 17745,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -20077,6 +20092,7 @@ impl TranslatedString {
"",
"",
"",
+ "Tap to wake",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -21308,6 +21324,7 @@ impl TranslatedString {
17734,
17734,
17734,
+ 17745,
];
} else if #[cfg(feature = "layout_delizia")] {
@@ -22539,6 +22556,7 @@ impl TranslatedString {
"",
"",
"",
+ "Tap to wake",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -23770,6 +23788,7 @@ impl TranslatedString {
19154,
19154,
19154,
+ 19165,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -25000,6 +25019,7 @@ impl TranslatedString {
"",
"",
"",
+ "Tap to wake",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -26231,6 +26251,7 @@ impl TranslatedString {
19154,
19154,
19154,
+ 19165,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -27461,6 +27482,7 @@ impl TranslatedString {
"",
"",
"",
+ "Tap to wake",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -28692,6 +28714,7 @@ impl TranslatedString {
19154,
19154,
19154,
+ 19165,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -29922,6 +29945,7 @@ impl TranslatedString {
"",
"",
"",
+ "Tap to wake",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -31153,6 +31177,7 @@ impl TranslatedString {
19154,
19154,
19154,
+ 19165,
];
} else if #[cfg(feature = "layout_eckhart")] {
@@ -32384,6 +32409,7 @@ impl TranslatedString {
"This tag is empty. Continue to scan a different tag.",
"Non-empty N4W1 tag.",
"This tag is damaged. Continue to try again or scan the next tag.",
+ "Tap to wake",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -33615,6 +33641,7 @@ impl TranslatedString {
20418,
20437,
20501,
+ 20512,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -34845,6 +34872,7 @@ impl TranslatedString {
"This tag is empty. Continue to scan a different tag.",
"Non-empty N4W1 tag.",
"This tag is damaged. Continue to try again or scan the next tag.",
+ "Tap to wake",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -36076,6 +36104,7 @@ impl TranslatedString {
20418,
20437,
20501,
+ 20512,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -37306,6 +37335,7 @@ impl TranslatedString {
"This tag is empty. Continue to scan a different tag.",
"Non-empty N4W1 tag.",
"This tag is damaged. Continue to try again or scan the next tag.",
+ "Tap to wake",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -38537,6 +38567,7 @@ impl TranslatedString {
20418,
20437,
20501,
+ 20512,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -39767,6 +39798,7 @@ impl TranslatedString {
"This tag is empty. Continue to scan a different tag.",
"Non-empty N4W1 tag.",
"This tag is damaged. Continue to try again or scan the next tag.",
+ "Tap to wake",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -40998,6 +41030,7 @@ impl TranslatedString {
20418,
20437,
20501,
+ 20512,
];
}
@@ -42588,6 +42621,7 @@ impl TranslatedString {
(Qstr::MP_QSTR_words__sign, Self::words__sign),
(Qstr::MP_QSTR_words__signer, Self::words__signer),
(Qstr::MP_QSTR_words__swap, Self::words__swap),
+ (Qstr::MP_QSTR_words__tap_to_wake, Self::words__tap_to_wake),
(Qstr::MP_QSTR_words__title_check, Self::words__title_check),
(Qstr::MP_QSTR_words__title_done, Self::words__title_done),
(Qstr::MP_QSTR_words__title_group, Self::words__title_group),
diff --git a/core/embed/rust/src/ui/api/firmware_micropython.rs b/core/embed/rust/src/ui/api/firmware_micropython.rs
index d6c0a494..8fe667ef 100644
--- a/core/embed/rust/src/ui/api/firmware_micropython.rs
+++ b/core/embed/rust/src/ui/api/firmware_micropython.rs
@@ -950,6 +950,9 @@ extern "C" fn new_show_device_menu(n_args: usize, args: *const Obj, kwargs: *mut
kwargs.get(Qstr::MP_QSTR_device_name)?.try_into_option()?;
let brightness: Option<TString> =
kwargs.get(Qstr::MP_QSTR_brightness)?.try_into_option()?;
+ let tap_to_wake_enabled: Option<bool> = kwargs
+ .get(Qstr::MP_QSTR_tap_to_wake_enabled)?
+ .try_into_option()?;
let haptics_enabled: Option<bool> = kwargs
.get(Qstr::MP_QSTR_haptics_enabled)?
.try_into_option()?;
@@ -971,6 +974,7 @@ extern "C" fn new_show_device_menu(n_args: usize, args: *const Obj, kwargs: *mut
backup_check_allowed,
device_name,
brightness,
+ tap_to_wake_enabled,
haptics_enabled,
led_enabled,
about_items,
@@ -1978,6 +1982,7 @@ pub static mp_module_trezorui_api: Module = obj_module! {
/// backup_check_allowed: bool,
/// device_name: str | None,
/// brightness: str | None,
+ /// tap_to_wake_enabled: bool | None,
/// haptics_enabled: bool | None,
/// led_enabled: bool | None,
/// about_items: Sequence[tuple[str | None, StrOrBytes | None, bool | None]],
@@ -2222,6 +2227,7 @@ pub static mp_module_trezorui_api: Module = obj_module! {
/// CheckBackup: ClassVar[int]
/// SetDeviceName: ClassVar[int]
/// SetBrightness: ClassVar[int]
+ /// ToggleTapToWake: ClassVar[int]
/// ToggleHaptics: ClassVar[int]
/// ToggleLed: ClassVar[int]
/// WipeDevice: ClassVar[int]
diff --git a/core/embed/rust/src/ui/layout/device_menu_result.rs b/core/embed/rust/src/ui/layout/device_menu_result.rs
index 6b85fcc2..ebf095ba 100644
--- a/core/embed/rust/src/ui/layout/device_menu_result.rs
+++ b/core/embed/rust/src/ui/layout/device_menu_result.rs
@@ -40,6 +40,7 @@ pub enum DeviceMenuMsg {
// Device menu
SetDeviceName,
SetBrightness,
+ ToggleTapToWake,
ToggleHaptics,
ToggleLed,
WipeDevice,
@@ -86,6 +87,7 @@ unsafe extern "C" fn device_menu_result_attr(_self_in: Obj, attr: ffi::qstr, des
Qstr::MP_QSTR_CheckBackup => DeviceMenuMsg::CheckBackup.as_obj(),
Qstr::MP_QSTR_SetDeviceName => DeviceMenuMsg::SetDeviceName.as_obj(),
Qstr::MP_QSTR_SetBrightness => DeviceMenuMsg::SetBrightness.as_obj(),
+ Qstr::MP_QSTR_ToggleTapToWake => DeviceMenuMsg::ToggleTapToWake.as_obj(),
Qstr::MP_QSTR_ToggleHaptics => DeviceMenuMsg::ToggleHaptics.as_obj(),
Qstr::MP_QSTR_ToggleLed => DeviceMenuMsg::ToggleLed.as_obj(),
Qstr::MP_QSTR_WipeDevice => DeviceMenuMsg::WipeDevice.as_obj(),
diff --git a/core/embed/rust/src/ui/layout_bolt/ui_firmware.rs b/core/embed/rust/src/ui/layout_bolt/ui_firmware.rs
index 762e61f0..3f554687 100644
--- a/core/embed/rust/src/ui/layout_bolt/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_bolt/ui_firmware.rs
@@ -929,6 +929,7 @@ impl FirmwareUI for UIBolt {
_backup_check_allowed: bool,
_device_name: Option<TString<'static>>,
_brightness: Option<TString<'static>>,
+ _tap_to_wake_enabled: Option<bool>,
_haptics_enabled: Option<bool>,
_led_enabled: Option<bool>,
_about_items: Obj,
diff --git a/core/embed/rust/src/ui/layout_caesar/ui_firmware.rs b/core/embed/rust/src/ui/layout_caesar/ui_firmware.rs
index 02178d43..cb624e65 100644
--- a/core/embed/rust/src/ui/layout_caesar/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_caesar/ui_firmware.rs
@@ -1112,6 +1112,7 @@ impl FirmwareUI for UICaesar {
_backup_check_allowed: bool,
_device_name: Option<TString<'static>>,
_brightness: Option<TString<'static>>,
+ _tap_to_wake_enabled: Option<bool>,
_haptics_enabled: Option<bool>,
_led_enabled: Option<bool>,
_about_items: Obj,
diff --git a/core/embed/rust/src/ui/layout_delizia/ui_firmware.rs b/core/embed/rust/src/ui/layout_delizia/ui_firmware.rs
index 2dfbe288..0264c5ca 100644
--- a/core/embed/rust/src/ui/layout_delizia/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_delizia/ui_firmware.rs
@@ -910,6 +910,7 @@ impl FirmwareUI for UIDelizia {
_backup_check_allowed: bool,
_device_name: Option<TString<'static>>,
_brightness: Option<TString<'static>>,
+ _tap_to_wake_enabled: Option<bool>,
_haptics_enabled: Option<bool>,
_led_enabled: Option<bool>,
_about_items: Obj,
diff --git a/core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rs b/core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rs
index 47f21949..0d5826ec 100644
--- a/core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/firmware/device_menu_screen.rs
@@ -93,6 +93,7 @@ impl DeviceMenuScreen {
DeviceMenuMsg::CheckBackup => DeviceMenuId::Security,
DeviceMenuMsg::SetDeviceName => DeviceMenuId::Device,
DeviceMenuMsg::SetBrightness => DeviceMenuId::Device,
+ DeviceMenuMsg::ToggleTapToWake => DeviceMenuId::Device,
DeviceMenuMsg::ToggleHaptics => DeviceMenuId::Device,
DeviceMenuMsg::ToggleLed => DeviceMenuId::Device,
DeviceMenuMsg::WipeDevice => DeviceMenuId::Device,
@@ -295,6 +296,7 @@ impl DeviceMenuScreen {
backup_check_allowed: bool,
device_name: Option<TString<'static>>,
brightness: Option<TString<'static>>,
+ tap_to_wake_enabled: Option<bool>,
haptics_enabled: Option<bool>,
led_enabled: Option<bool>,
about_items: Obj,
@@ -324,7 +326,13 @@ impl DeviceMenuScreen {
backup_check_allowed,
);
}
- screen.register_device_menu(device_name, brightness, haptics_enabled, led_enabled);
+ screen.register_device_menu(
+ device_name,
+ brightness,
+ tap_to_wake_enabled,
+ haptics_enabled,
+ led_enabled,
+ );
screen.register_settings_menu(ble_enabled);
screen.register_power_menu();
@@ -618,6 +626,7 @@ impl DeviceMenuScreen {
&mut self,
device_name: Option<TString<'static>>,
brightness: Option<TString<'static>>,
+ tap_to_wake_enabled: Option<bool>,
haptics_enabled: Option<bool>,
led_enabled: Option<bool>,
) {
@@ -635,6 +644,22 @@ impl DeviceMenuScreen {
items.add(brightness_item);
}
+ if let Some(tap_to_wake_enabled) = tap_to_wake_enabled {
+ let subtext = match tap_to_wake_enabled {
+ true => (
+ TR::words__on.into(),
+ Some(&theme::TEXT_MENU_ITEM_SUBTITLE_GREEN),
+ ),
+ _ => (TR::words__off.into(), None),
+ };
+ let tap_to_wake_item = MenuItem::return_msg(
+ TR::words__tap_to_wake.into(),
+ DeviceMenuMsg::ToggleTapToWake,
+ )
+ .with_subtext(Some(subtext));
+ items.add(tap_to_wake_item);
+ }
+
if let Some(haptics_enabled) = haptics_enabled {
let subtext = match haptics_enabled {
true => (
diff --git a/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs b/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
index 3daf9fe3..c7ff58ae 100644
--- a/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
+++ b/core/embed/rust/src/ui/layout_eckhart/ui_firmware.rs
@@ -1096,6 +1096,7 @@ impl FirmwareUI for UIEckhart {
backup_check_allowed: bool,
device_name: Option<TString<'static>>,
brightness: Option<TString<'static>>,
+ tap_to_wake_enabled: Option<bool>,
haptics_enabled: Option<bool>,
led_enabled: Option<bool>,
about_items: Obj,
@@ -1114,6 +1115,7 @@ impl FirmwareUI for UIEckhart {
backup_check_allowed,
device_name,
brightness,
+ tap_to_wake_enabled,
haptics_enabled,
led_enabled,
about_items,
diff --git a/core/embed/rust/src/ui/ui_firmware.rs b/core/embed/rust/src/ui/ui_firmware.rs
index 3e21fcce..56f65467 100644
--- a/core/embed/rust/src/ui/ui_firmware.rs
+++ b/core/embed/rust/src/ui/ui_firmware.rs
@@ -350,6 +350,7 @@ pub trait FirmwareUI {
backup_check_allowed: bool,
device_name: Option<TString<'static>>,
brightness: Option<TString<'static>>,
+ tap_to_wake_enabled: Option<bool>,
haptics_enabled: Option<bool>,
led_enabled: Option<bool>,
about_items: Obj,
diff --git a/core/mocks/generated/trezorui_api.pyi b/core/mocks/generated/trezorui_api.pyi
index d573c4dc..7ae02f53 100644
--- a/core/mocks/generated/trezorui_api.pyi
+++ b/core/mocks/generated/trezorui_api.pyi
@@ -642,6 +642,7 @@ def show_device_menu(
backup_check_allowed: bool,
device_name: str | None,
brightness: str | None,
+ tap_to_wake_enabled: bool | None,
haptics_enabled: bool | None,
led_enabled: bool | None,
about_items: Sequence[tuple[str | None, StrOrBytes | None, bool | None]],
@@ -910,6 +911,7 @@ class DeviceMenuResult:
CheckBackup: ClassVar[int]
SetDeviceName: ClassVar[int]
SetBrightness: ClassVar[int]
+ ToggleTapToWake: ClassVar[int]
ToggleHaptics: ClassVar[int]
ToggleLed: ClassVar[int]
WipeDevice: ClassVar[int]
diff --git a/core/mocks/trezortranslate_keys.pyi b/core/mocks/trezortranslate_keys.pyi
index aff03e82..bdc87ea1 100644
--- a/core/mocks/trezortranslate_keys.pyi
+++ b/core/mocks/trezortranslate_keys.pyi
@@ -1143,6 +1143,7 @@ class TR:
words__sign: str = "Sign"
words__signer: str = "Signer"
words__swap: str = "Swap"
+ words__tap_to_wake: str = "Tap to wake"
words__title_check: str = "Check"
words__title_done: str = "Done"
words__title_group: str = "Group"
diff --git a/core/src/apps/common/lock_manager.py b/core/src/apps/common/lock_manager.py
index be582822..7f60dc55 100644
--- a/core/src/apps/common/lock_manager.py
+++ b/core/src/apps/common/lock_manager.py
@@ -259,6 +259,9 @@ def reload_settings_from_storage() -> None:
if utils.USE_HAPTIC:
io.haptic.haptic_set_enabled(storage_device.get_haptic_feedback())
+ if utils.USE_TOUCH_WAKEUP:
+ io.touch.touch_wakeup_set_enabled(storage_device.get_tap_to_wake())
+
if utils.USE_RGB_LED:
io.rgb_led.rgb_led_set_enabled(storage_device.get_rgb_led())
diff --git a/core/src/apps/homescreen/device_menu.py b/core/src/apps/homescreen/device_menu.py
index c35ec1dc..e375c4fa 100644
--- a/core/src/apps/homescreen/device_menu.py
+++ b/core/src/apps/homescreen/device_menu.py
@@ -81,6 +81,7 @@ async def handle_device_menu() -> None:
is_initialized = storage_device.is_initialized()
led_configurable = is_initialized and utils.USE_RGB_LED
haptic_configurable = is_initialized and utils.USE_HAPTIC
+ tap_to_wake_configurable = is_initialized and utils.USE_TOUCH_WAKEUP
backup_failed = is_initialized and storage_device.unfinished_backup()
backup_needed = is_initialized and storage_device.needs_backup()
backup_finished = (
@@ -139,6 +140,11 @@ async def handle_device_menu() -> None:
else None
),
brightness=TR.brightness__title if is_initialized else None,
+ tap_to_wake_enabled=(
+ storage_device.get_tap_to_wake()
+ if tap_to_wake_configurable
+ else None
+ ),
haptics_enabled=(
storage_device.get_haptic_feedback()
if haptic_configurable
@@ -419,6 +425,17 @@ async def handle_SetBrightness() -> None:
utils.notify_send(utils.NOTIFY_SETTING_CHANGE)
+async def handle_ToggleTapToWake() -> None:
+ from trezor import io
+
+ utils.ensure(storage_device.is_initialized() and utils.USE_TOUCH_WAKEUP)
+
+ enable = not storage_device.get_tap_to_wake()
+ io.touch.touch_wakeup_set_enabled(enable)
+ storage_device.set_tap_to_wake(enable)
+ utils.notify_send(utils.NOTIFY_SETTING_CHANGE)
+
+
async def handle_ToggleHaptics() -> None:
from trezor import io
@@ -487,6 +504,7 @@ _MENU_HANDLERS = {
DeviceMenuResult.CheckBackup: handle_CheckBackup,
DeviceMenuResult.SetDeviceName: handle_SetDeviceName,
DeviceMenuResult.SetBrightness: handle_SetBrightness,
+ DeviceMenuResult.ToggleTapToWake: handle_ToggleTapToWake,
DeviceMenuResult.ToggleHaptics: handle_ToggleHaptics,
DeviceMenuResult.ToggleLed: handle_ToggleLed,
DeviceMenuResult.WipeDevice: handle_WipeDevice,
diff --git a/core/src/boot.py b/core/src/boot.py
index 82fa08e5..5c5fbe14 100644
--- a/core/src/boot.py
+++ b/core/src/boot.py
@@ -106,6 +106,8 @@ async def bootscreen() -> None:
if utils.INTERNAL_MODEL == "T2T1":
ui.backlight_fade(ui.BacklightLevels.NONE)
ui.display.orientation(storage.device.get_rotation())
+ if utils.USE_TOUCH_WAKEUP:
+ io.touch.touch_wakeup_set_enabled(storage.device.get_tap_to_wake())
if utils.USE_HAPTIC:
io.haptic.haptic_set_enabled(storage.device.get_haptic_feedback())
if utils.USE_RGB_LED:
@@ -121,6 +123,8 @@ async def bootscreen() -> None:
storage.init_unlocked()
enforce_welcome_screen_duration()
rotation = storage.device.get_rotation()
+ if utils.USE_TOUCH_WAKEUP:
+ io.touch.touch_wakeup_set_enabled(storage.device.get_tap_to_wake())
if utils.USE_HAPTIC:
io.haptic.haptic_set_enabled(storage.device.get_haptic_feedback())
if utils.USE_RGB_LED:
diff --git a/core/translations/en.json b/core/translations/en.json
index bee19684..1e46e8d2 100644
--- a/core/translations/en.json
+++ b/core/translations/en.json
@@ -3190,6 +3190,7 @@
"words__sign": "Sign",
"words__signer": "Signer",
"words__swap": "Swap",
+ "words__tap_to_wake": "Tap to wake",
"words__title_check": {
"Bolt": "",
"Caesar": "Check",
diff --git a/core/translations/order.json b/core/translations/order.json
index 546d6f05..d4d91744 100644
--- a/core/translations/order.json
+++ b/core/translations/order.json
@@ -1224,5 +1224,6 @@
"1222": "n4w1__reading",
"1223": "n4w1__err_empty",
"1224": "n4w1__err_nonempty",
- "1225": "n4w1__err_damaged"
+ "1225": "n4w1__err_damaged",
+ "1226": "words__tap_to_wake"
}
diff --git a/core/translations/signatures.json b/core/translations/signatures.json
index 358c6025..4d30bf87 100644
--- a/core/translations/signatures.json
+++ b/core/translations/signatures.json
@@ -1,8 +1,8 @@
{
"current": {
- "merkle_root": "e028290397da1f6a461e20b8fc038330b92317be4ac37fd245086299bb6bca09",
- "datetime": "2026-05-15T14:23:38.857574+00:00",
- "commit": "ab55d4c69909a861442028a939b1b5ac498123d1"
+ "merkle_root": "0e818696a1741ab889865edaefe628d4c2fcca9d832e12ee281503c55ab497bf",
+ "datetime": "2026-05-19T10:50:49.568716+00:00",
+ "commit": "3888a319cf990a14007e85ba9628898a92bc88a4"
},
"history": [
{
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.