feat(core/bootloader): add LED effect to bootloader pairing workflow.
What changed, and why it matters
This commit adds colored LED lighting effects during the Bluetooth pairing process in the Trezor bootloader. It is purely a user-interface change to give visual feedback when the device is in pairing mode. There is no indication it fixes or introduces any security vulnerability.
No security action needed. Treat as normal feature commit.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The change wraps calls to rgb_led_effect_start(RGB_LED_EFFECT_PAIRING, 0) and rgb_led_effect_stop() around two bootloader workflows: workflow_ble_pairing_request and workflow_wireless_setup. These are guarded by USE_RGB_LED and only affect LED state. No logic, buffer handling, authentication, or cryptographic code is modified.
Changed components
core/embed/projects/bootloader/workflow/wf_ble_pairing_request.cInspect captured patch +20 / −0
diff --git a/core/embed/projects/bootloader/workflow/wf_ble_pairing_request.c b/core/embed/projects/bootloader/workflow/wf_ble_pairing_request.c
index 98ce6c91..fb4548cc 100644
--- a/core/embed/projects/bootloader/workflow/wf_ble_pairing_request.c
+++ b/core/embed/projects/bootloader/workflow/wf_ble_pairing_request.c
@@ -29,6 +29,10 @@
#include "wire/wire_iface_ble.h"
#include "workflow.h"
+#ifdef USE_RGB_LED
+#include <io/rgb_led.h>
+#endif
+
static bool encode_pairing_code(uint32_t code, uint8_t *outbuf) {
if (code > 999999) {
return false;
@@ -49,6 +53,10 @@ workflow_result_t workflow_ble_pairing_request(const vendor_header *const vhdr,
char name[BLE_ADV_NAME_LEN + 1] = {0};
ble_get_advertising_name(name, sizeof(name));
+#ifdef USE_RGB_LED
+ rgb_led_effect_start(RGB_LED_EFFECT_PAIRING, 0);
+#endif
+
c_layout_t layout;
memset(&layout, 0, sizeof(layout));
screen_pairing_mode(ui_get_initial_setup(), name, strlen(name), &layout);
@@ -57,6 +65,10 @@ workflow_result_t workflow_ble_pairing_request(const vendor_header *const vhdr,
workflow_result_t res =
workflow_host_control(vhdr, hdr, &layout, &code, NULL);
+#ifdef USE_RGB_LED
+ rgb_led_effect_stop();
+#endif
+
if (res != WF_OK_UI_ACTION) {
ble_iface_end_pairing();
return res;
@@ -129,6 +141,10 @@ workflow_result_t workflow_wireless_setup(const vendor_header *const vhdr,
char name[BLE_ADV_NAME_LEN + 1] = {0};
ble_get_advertising_name(name, sizeof(name));
+#ifdef USE_RGB_LED
+ rgb_led_effect_start(RGB_LED_EFFECT_PAIRING, 0);
+#endif
+
c_layout_t layout;
memset(&layout, 0, sizeof(layout));
screen_wireless_setup(name, strlen(name), &layout);
@@ -136,6 +152,10 @@ workflow_result_t workflow_wireless_setup(const vendor_header *const vhdr,
uint32_t code = 0;
workflow_result_t res = workflow_host_control(vhdr, hdr, &layout, &code, ios);
+#ifdef USE_RGB_LED
+ rgb_led_effect_stop();
+#endif
+
if (res != WF_OK_UI_ACTION) {
ble_iface_end_pairing();
return res;
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.