Skip to content

Commit 8239b1c

Browse files
committed
chore(core): add LED enable/disable functionality
[no changelog]
1 parent a6f6dbb commit 8239b1c

File tree

37 files changed

+383
-32
lines changed

37 files changed

+383
-32
lines changed

core/embed/io/rgb_led/inc/io/rgb_led.h

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,22 @@ void rgb_led_init(void);
3030
// Deinitialize RGB LED driver
3131
void rgb_led_deinit(void);
3232

33-
#endif
33+
#endif // KERNEL_MODE
3434

35-
#define RGBLED_GREEN 0x00FF00
36-
#define RGBLED_RED 0xFF0000
37-
#define RGBLED_BLUE 0x0000FF
38-
#define RGBLED_YELLOW 0xFFFF00
35+
// Set RGB LED enabled state
36+
// enabled: true to enable, false to disable
37+
void rgb_led_set_enabled(bool enabled);
38+
39+
// Get RGB LED enabled state
40+
bool rgb_led_get_enabled(void);
3941

4042
// Set RGB LED color
4143
// color: 24-bit RGB color, 0x00RRGGBB
4244
void rgb_led_set_color(uint32_t color);
4345

46+
#define RGBLED_GREEN 0x00FF00
47+
#define RGBLED_RED 0xFF0000
48+
#define RGBLED_BLUE 0x0000FF
49+
#define RGBLED_YELLOW 0xFFFF00
50+
4451
#endif // TREZORHAL_RGB_LED_H

core/embed/io/rgb_led/stm32/rgb_led.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
typedef struct {
1313
TIM_HandleTypeDef tim;
1414
bool initialized;
15+
bool enabled;
1516
} rgb_led_t;
1617

1718
static rgb_led_t g_rgb_led = {0};
@@ -64,6 +65,7 @@ void rgb_led_init(void) {
6465
HAL_TIM_PWM_Start(&drv->tim, TIM_CHANNEL_3);
6566

6667
drv->initialized = true;
68+
drv->enabled = true;
6769
}
6870

6971
void rgb_led_deinit(void) {
@@ -82,12 +84,41 @@ void rgb_led_deinit(void) {
8284
drv->initialized = false;
8385
}
8486

87+
void rgb_led_set_enabled(bool enabled) {
88+
rgb_led_t* drv = &g_rgb_led;
89+
90+
if (!drv->initialized) {
91+
return;
92+
}
93+
94+
// If the RGB LED is to be disabled, turn off the LED
95+
if (!enabled) {
96+
rgb_led_set_color(0);
97+
}
98+
99+
drv->enabled = enabled;
100+
}
101+
102+
bool rgb_led_get_enabled(void) {
103+
rgb_led_t* drv = &g_rgb_led;
104+
105+
if (!drv->initialized) {
106+
return false;
107+
}
108+
109+
return drv->enabled;
110+
}
111+
85112
void rgb_led_set_color(uint32_t color) {
86113
rgb_led_t* drv = &g_rgb_led;
87114
if (!drv->initialized) {
88115
return;
89116
}
90117

118+
if (!drv->enabled) {
119+
return;
120+
}
121+
91122
TIM4->CCR1 = ((color >> 16) & 0xFF) * TIMER_PERIOD / 255;
92123
TIM4->CCR2 = ((color >> 8) & 0xFF) * TIMER_PERIOD / 255;
93124
TIM4->CCR3 = (color & 0xFF) * TIMER_PERIOD / 255;

core/embed/io/rgb_led/stm32u5/rgb_led_lp.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ typedef struct {
4646
LPTIM_HandleTypeDef tim_1;
4747
LPTIM_HandleTypeDef tim_3;
4848
bool initialized;
49+
bool enabled;
4950
} rgb_led_t;
5051

5152
static rgb_led_t g_rgb_led = {0};
@@ -164,6 +165,7 @@ void rgb_led_init(void) {
164165
HAL_GPIO_Init(RGB_LED_BLUE_PORT, &GPIO_InitStructure);
165166

166167
drv->initialized = true;
168+
drv->enabled = true;
167169
}
168170

169171
void rgb_led_deinit(void) {
@@ -192,12 +194,41 @@ void rgb_led_deinit(void) {
192194
memset(drv, 0, sizeof(*drv));
193195
}
194196

197+
void rgb_led_set_enabled(bool enabled) {
198+
rgb_led_t* drv = &g_rgb_led;
199+
200+
if (!drv->initialized) {
201+
return;
202+
}
203+
204+
// If the RGB LED is to be disabled, turn off the LED
205+
if (!enabled) {
206+
rgb_led_set_color(0);
207+
}
208+
209+
drv->enabled = enabled;
210+
}
211+
212+
bool rgb_led_get_enabled(void) {
213+
rgb_led_t* drv = &g_rgb_led;
214+
215+
if (!drv->initialized) {
216+
return false;
217+
}
218+
219+
return drv->enabled;
220+
}
221+
195222
void rgb_led_set_color(uint32_t color) {
196223
rgb_led_t* drv = &g_rgb_led;
197224
if (!drv->initialized) {
198225
return;
199226
}
200227

228+
if (!drv->enabled) {
229+
return;
230+
}
231+
201232
uint32_t red = (color >> 16) & 0xFF;
202233
uint32_t green = (color >> 8) & 0xFF;
203234
uint32_t blue = color & 0xFF;

core/embed/io/rgb_led/unix/rgb_led.c

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,64 @@
1717
* along with this program. If not, see <http://www.gnu.org/licenses/>.
1818
*/
1919

20+
#include <trezor_rtl.h>
21+
2022
#include <io/rgb_led.h>
2123
#include <io/unix/sdl_display.h>
2224

2325
#ifdef KERNEL_MODE
24-
void rgb_led_init(void){};
25-
void rgb_led_deinit(void){};
26-
#endif
2726

28-
void rgb_led_set_color(uint32_t color) { display_rgb_led(color); }
27+
// Driver state
28+
typedef struct {
29+
bool initialized;
30+
bool enabled;
31+
} rgb_led_driver_t;
32+
33+
// RGB LED driver instance
34+
static rgb_led_driver_t g_rgb_led_driver = {
35+
.initialized = true,
36+
.enabled = false,
37+
};
38+
39+
void rgb_led_init(void) {
40+
rgb_led_driver_t *driver = &g_rgb_led_driver;
41+
42+
driver->initialized = true;
43+
driver->enabled = true;
44+
}
45+
46+
void rgb_led_deinit(void) {
47+
rgb_led_driver_t *driver = &g_rgb_led_driver;
48+
memset(driver, 0, sizeof(rgb_led_driver_t));
49+
}
50+
51+
void rgb_led_set_enabled(bool enabled) {
52+
rgb_led_driver_t *driver = &g_rgb_led_driver;
53+
54+
if (!driver->initialized) {
55+
return;
56+
}
57+
58+
driver->enabled = enabled;
59+
}
60+
61+
bool rgb_led_get_enabled(void) {
62+
rgb_led_driver_t *driver = &g_rgb_led_driver;
63+
64+
if (!driver->initialized) {
65+
return false;
66+
}
67+
68+
return driver->enabled;
69+
}
70+
71+
void rgb_led_set_color(uint32_t color) {
72+
rgb_led_driver_t *driver = &g_rgb_led_driver;
73+
if (!driver->initialized || !driver->enabled) {
74+
return;
75+
}
76+
77+
display_rgb_led(color);
78+
}
79+
80+
#endif /* KERNEL_MODE */

core/embed/projects/bootloader/main.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,9 @@ static secbool boot_sequence(void) {
216216

217217
if (state.charging_status == PM_BATTERY_CHARGING) {
218218
// charing screen
219-
rgb_led_set_color(0x0000FF);
219+
#ifdef USE_RGB_LED
220+
rgb_led_set_color(RGBLED_BLUE);
221+
#endif
220222
} else {
221223
if (!btn_down && !state.usb_connected && !state.wireless_connected) {
222224
// device in just intended to be turned off
@@ -229,20 +231,34 @@ static secbool boot_sequence(void) {
229231
}
230232
}
231233

234+
#ifdef USE_RGB_LED
232235
rgb_led_set_color(0);
236+
#endif
233237

234238
while (pm_turn_on() != PM_OK) {
239+
#ifdef USE_RGB_LED
235240
rgb_led_set_color(0x400000);
241+
#endif
236242
systick_delay_ms(400);
243+
#ifdef USE_RGB_LED
237244
rgb_led_set_color(0);
245+
#endif
238246
systick_delay_ms(400);
247+
#ifdef USE_RGB_LED
239248
rgb_led_set_color(0x400000);
249+
#endif
240250
systick_delay_ms(400);
251+
#ifdef USE_RGB_LED
241252
rgb_led_set_color(0);
253+
#endif
242254
systick_delay_ms(400);
255+
#ifdef USE_RGB_LED
243256
rgb_led_set_color(0x400000);
257+
#endif
244258
systick_delay_ms(400);
259+
#ifdef USE_RGB_LED
245260
rgb_led_set_color(0);
261+
#endif
246262
pm_hibernate();
247263
systick_delay_ms(1000);
248264
reboot_to_off();

core/embed/projects/prodtest/main.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,15 +338,21 @@ int prodtest_main(void) {
338338
} else if (btn_event.event_type == BTN_EVENT_UP) {
339339
if (ticks_expired(btn_deadline)) {
340340
pm_hibernate();
341+
#ifdef USE_RGB_LED
341342
rgb_led_set_color(RGBLED_YELLOW);
343+
#endif
342344
systick_delay_ms(1000);
345+
#ifdef USE_RGB_LED
343346
rgb_led_set_color(0);
347+
#endif
344348
}
345349
}
346350
}
347351
}
348352
if (button_is_down(BTN_POWER) && ticks_expired(btn_deadline)) {
353+
#ifdef USE_RGB_LED
349354
rgb_led_set_color(RGBLED_RED);
355+
#endif
350356
}
351357
#endif
352358

core/embed/rust/librust_qstr.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ static void _librust_qstrs(void) {
3737
MP_QSTR_LOW;
3838
MP_QSTR_LayoutObj;
3939
MP_QSTR_LayoutState;
40+
MP_QSTR_Led;
4041
MP_QSTR_MAX;
4142
MP_QSTR_MESSAGE_NAME;
4243
MP_QSTR_MESSAGE_WIRE_TYPE;
@@ -381,6 +382,10 @@ static void _librust_qstrs(void) {
381382
MP_QSTR_language__changed;
382383
MP_QSTR_language__progress;
383384
MP_QSTR_language__title;
385+
MP_QSTR_led;
386+
MP_QSTR_led__disable;
387+
MP_QSTR_led__enable;
388+
MP_QSTR_led__title;
384389
MP_QSTR_lines;
385390
MP_QSTR_load_from_flash;
386391
MP_QSTR_lockable;
@@ -899,10 +904,13 @@ static void _librust_qstrs(void) {
899904
MP_QSTR_words__instructions;
900905
MP_QSTR_words__keep_it_safe;
901906
MP_QSTR_words__know_what_your_doing;
907+
MP_QSTR_words__led;
902908
MP_QSTR_words__my_trezor;
903909
MP_QSTR_words__name;
904910
MP_QSTR_words__no;
905911
MP_QSTR_words__not_recommended;
912+
MP_QSTR_words__off;
913+
MP_QSTR_words__on;
906914
MP_QSTR_words__operation_cancelled;
907915
MP_QSTR_words__outputs;
908916
MP_QSTR_words__pay_attention;

core/embed/rust/src/translations/generated/translated_string.rs

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/embed/rust/src/ui/api/firmware_micropython.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -944,12 +944,14 @@ extern "C" fn new_show_device_menu(n_args: usize, args: *const Obj, kwargs: *mut
944944
let paired_devices: Vec<TString, 1> = util::iter_into_vec(paired_devices)?;
945945
let auto_lock_delay: TString<'static> =
946946
kwargs.get(Qstr::MP_QSTR_auto_lock_delay)?.try_into()?;
947+
let led: Option<bool> = kwargs.get(Qstr::MP_QSTR_led)?.try_into_option()?;
947948
let layout = ModelUI::show_device_menu(
948949
failed_backup,
949950
firmware_version,
950951
device_name,
951952
paired_devices,
952953
auto_lock_delay,
954+
led,
953955
)?;
954956
let layout_obj = LayoutObj::new_root(layout)?;
955957
Ok(layout_obj.into())
@@ -1882,6 +1884,7 @@ pub static mp_module_trezorui_api: Module = obj_module! {
18821884
/// device_name: str | None,
18831885
/// paired_devices: Iterable[str],
18841886
/// auto_lock_delay: str,
1887+
/// led: bool | None,
18851888
/// ) -> LayoutObj[UiResult | DeviceMenuResult | tuple[DeviceMenuResult, int]]:
18861889
/// """Show the device menu."""
18871890
Qstr::MP_QSTR_show_device_menu => obj_fn_kw!(0, new_show_device_menu).as_obj(),
@@ -2085,5 +2088,6 @@ pub static mp_module_trezorui_api: Module = obj_module! {
20852088
/// ScreenBrightness: ClassVar[DeviceMenuResult]
20862089
/// AutoLockDelay: ClassVar[DeviceMenuResult]
20872090
/// DeviceName: ClassVar[DeviceMenuResult]
2091+
/// Led: ClassVar[DeviceMenuResult]
20882092
Qstr::MP_QSTR_DeviceMenuResult => DEVICE_MENU_RESULT.as_obj(),
20892093
};

0 commit comments

Comments
 (0)