From 64bc94cbc9ab838571e99258a451f37270633bbc Mon Sep 17 00:00:00 2001 From: tychovrahe Date: Sat, 11 Mar 2023 21:02:31 +0100 Subject: [PATCH] feat(core): uninitialized welcome flow [no changelog] --- core/assets/device_name_T.png | Bin 0 -> 8938 bytes core/assets/lock_empty.png | Bin 0 -> 11325 bytes core/assets/lock_full.png | Bin 0 -> 9742 bytes core/assets/logo.jpg | Bin 12088 -> 0 bytes core/assets/start.png | Bin 0 -> 9040 bytes core/embed/bootloader/bootui.c | 1 + core/embed/bootloader/bootui.h | 1 + core/embed/bootloader/main.c | 2 + core/embed/firmware/main.c | 2 - core/embed/rust/rust_ui.h | 1 + core/embed/rust/src/ui/geometry.rs | 1 + .../rust/src/ui/model_tt/bootloader/mod.rs | 29 +++++---- .../rust/src/ui/model_tt/bootloader/theme.rs | 4 +- .../src/ui/model_tt/bootloader/welcome.rs | 59 ++++++++++++++++++ .../ui/model_tt/component/welcome_screen.rs | 16 ++++- .../src/ui/model_tt/res/device_name_T.toif | Bin 0 -> 555 bytes .../rust/src/ui/model_tt/res/lock_empty.toif | Bin 0 -> 546 bytes .../rust/src/ui/model_tt/res/lock_full.toif | Bin 0 -> 393 bytes core/embed/rust/src/ui/model_tt/res/logo.toif | Bin 437 -> 0 bytes .../embed/rust/src/ui/model_tt/res/start.toif | Bin 0 -> 641 bytes core/embed/rust/src/ui/model_tt/theme.rs | 2 +- core/embed/trezorhal/displays/st7789v.c | 42 ++++++------- core/src/boot.py | 2 +- 23 files changed, 115 insertions(+), 47 deletions(-) create mode 100644 core/assets/device_name_T.png create mode 100644 core/assets/lock_empty.png create mode 100644 core/assets/lock_full.png delete mode 100644 core/assets/logo.jpg create mode 100644 core/assets/start.png create mode 100644 core/embed/rust/src/ui/model_tt/bootloader/welcome.rs create mode 100644 core/embed/rust/src/ui/model_tt/res/device_name_T.toif create mode 100644 core/embed/rust/src/ui/model_tt/res/lock_empty.toif create mode 100644 core/embed/rust/src/ui/model_tt/res/lock_full.toif delete mode 100644 core/embed/rust/src/ui/model_tt/res/logo.toif create mode 100644 core/embed/rust/src/ui/model_tt/res/start.toif diff --git a/core/assets/device_name_T.png b/core/assets/device_name_T.png new file mode 100644 index 0000000000000000000000000000000000000000..93f17c7bcb417592ae3da210da1f61d36393b04b GIT binary patch literal 8938 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 O1YitI^b2$yLjMPc&i{G< literal 0 HcmV?d00001 diff --git a/core/assets/lock_empty.png b/core/assets/lock_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..e7145516a85a26c0bb66049e5c71dadd7c3af862 GIT binary patch literal 11325 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 KDm6+rVgCb^MZXCE literal 0 HcmV?d00001 diff --git a/core/assets/lock_full.png b/core/assets/lock_full.png new file mode 100644 index 0000000000000000000000000000000000000000..7bbf058efa121d68e74435c917b0b21bf318ec91 GIT binary patch literal 9742 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 literal 0 HcmV?d00001 diff --git a/core/assets/logo.jpg b/core/assets/logo.jpg deleted file mode 100644 index a3b4eecc99264d0a085055f2bf1dfdd19c42ae3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12088 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 OfU&;0UX9MVnEwHTr5ca` literal 0 HcmV?d00001 diff --git a/core/embed/bootloader/bootui.c b/core/embed/bootloader/bootui.c index 141b60d96..85c45196b 100644 --- a/core/embed/bootloader/bootui.c +++ b/core/embed/bootloader/bootui.c @@ -117,6 +117,7 @@ void ui_screen_boot_click(void) { // welcome UI +void ui_screen_welcome_model(void) { screen_welcome_model(); } void ui_screen_welcome(void) { screen_welcome(); } uint32_t ui_screen_intro(const vendor_header *const vhdr, diff --git a/core/embed/bootloader/bootui.h b/core/embed/bootloader/bootui.h index 5159d7a7a..6b6dc5e4e 100644 --- a/core/embed/bootloader/bootui.h +++ b/core/embed/bootloader/bootui.h @@ -37,6 +37,7 @@ void ui_screen_boot(const vendor_header* const vhdr, void ui_screen_boot_wait(int wait_seconds); void ui_screen_boot_click(void); +void ui_screen_welcome_model(void); void ui_screen_welcome(void); uint32_t ui_screen_intro(const vendor_header* const vhdr, diff --git a/core/embed/bootloader/main.c b/core/embed/bootloader/main.c index a00567ac3..10875fccc 100644 --- a/core/embed/bootloader/main.c +++ b/core/embed/bootloader/main.c @@ -359,6 +359,8 @@ int main(void) { ui_set_initial_setup(true); + ui_screen_welcome_model(); + hal_delay(1000); ui_screen_welcome(); // erase storage diff --git a/core/embed/firmware/main.c b/core/embed/firmware/main.c index 6f157a691..d4c5fc6ec 100644 --- a/core/embed/firmware/main.c +++ b/core/embed/firmware/main.c @@ -135,8 +135,6 @@ int main(void) { sdcard_init(); #endif - display_clear(); - #if !defined TREZOR_MODEL_1 // jump to unprivileged mode // http://infocenter.arm.com/help/topic/com.arm.doc.dui0552a/CHDBIBGJ.html diff --git a/core/embed/rust/rust_ui.h b/core/embed/rust/rust_ui.h index 1cd3b6bba..b27e0cc45 100644 --- a/core/embed/rust/rust_ui.h +++ b/core/embed/rust/rust_ui.h @@ -24,5 +24,6 @@ void screen_wipe_fail(void); uint32_t screen_install_success(const char* reboot_msg, bool initial_setup, bool complete_draw); uint32_t screen_install_fail(void); +void screen_welcome_model(void); void screen_welcome(void); void screen_boot_empty(bool firmware_present, bool fading); diff --git a/core/embed/rust/src/ui/geometry.rs b/core/embed/rust/src/ui/geometry.rs index 077ee9aa8..bab90e4f7 100644 --- a/core/embed/rust/src/ui/geometry.rs +++ b/core/embed/rust/src/ui/geometry.rs @@ -474,6 +474,7 @@ pub const TOP_CENTER: Alignment2D = (Alignment::Center, Alignment::Start); pub const CENTER: Alignment2D = (Alignment::Center, Alignment::Center); pub const BOTTOM_LEFT: Alignment2D = (Alignment::Start, Alignment::End); pub const BOTTOM_RIGHT: Alignment2D = (Alignment::End, Alignment::End); +pub const BOTTOM_CENTER: Alignment2D = (Alignment::Center, Alignment::End); #[derive(Copy, Clone, PartialEq, Eq)] pub enum Axis { diff --git a/core/embed/rust/src/ui/model_tt/bootloader/mod.rs b/core/embed/rust/src/ui/model_tt/bootloader/mod.rs index 3f9b8c77a..c6b66a983 100644 --- a/core/embed/rust/src/ui/model_tt/bootloader/mod.rs +++ b/core/embed/rust/src/ui/model_tt/bootloader/mod.rs @@ -5,7 +5,7 @@ use crate::{ display::{self, Font}, event::TouchEvent, geometry::Point, - model_tt::constant, + model_tt::{component::WelcomeScreen, constant}, }, }; use heapless::String; @@ -16,6 +16,7 @@ mod connect; pub mod intro; pub mod menu; pub mod theme; +pub mod welcome; use crate::{ strutil::hexlify, @@ -23,7 +24,7 @@ use crate::{ component::text::paragraphs::{Paragraph, ParagraphVecShort, Paragraphs, VecExt}, constant::screen, display::{Color, Icon}, - geometry::{Alignment, LinearPlacement, CENTER}, + geometry::{Alignment, LinearPlacement, TOP_CENTER}, model_tt::{ bootloader::{ connect::Connect, @@ -33,6 +34,7 @@ use crate::{ CHECK40, DOWNLOAD32, FIRE32, FIRE40, LOGO_EMPTY, TEXT_WIPE_BOLD, TEXT_WIPE_NORMAL, WARNING40, WELCOME_COLOR, WELCOME_HIGHLIGHT_COLOR, X24, }, + welcome::Welcome, }, component::{Button, ResultScreen}, theme::{ @@ -401,7 +403,7 @@ extern "C" fn screen_boot_empty(firmware_present: bool, fading: bool) { }; display::rect_fill(constant::screen(), bg); let icon = Icon::new(LOGO_EMPTY); - icon.draw(screen().center(), CENTER, fg, bg); + icon.draw(Point::new(screen().center().x, 48), TOP_CENTER, fg, bg); if fading { fadein(); @@ -502,16 +504,13 @@ extern "C" fn screen_install_success( } #[no_mangle] -extern "C" fn screen_welcome() { - fadeout(); - display::rect_fill(screen(), WELCOME_COLOR); - - let mut messages = ParagraphVecShort::new(); - messages.add(Paragraph::new(&theme::TEXT_WELCOME, "Get started with").centered()); - messages.add(Paragraph::new(&theme::TEXT_WELCOME, "your trezor at").centered()); - messages.add(Paragraph::new(&theme::TEXT_WELCOME_URL, "trezor.io/start").centered()); - let mut frame = - Paragraphs::new(messages).with_placement(LinearPlacement::vertical().align_at_center()); - show(&mut frame, false); - fadein(); +extern "C" fn screen_welcome_model() { + let mut frame = WelcomeScreen::new(); + show(&mut frame, true); +} + +#[no_mangle] +extern "C" fn screen_welcome() { + let mut frame = Welcome::new(); + show(&mut frame, true); } diff --git a/core/embed/rust/src/ui/model_tt/bootloader/theme.rs b/core/embed/rust/src/ui/model_tt/bootloader/theme.rs index 090df5b13..c462d1320 100644 --- a/core/embed/rust/src/ui/model_tt/bootloader/theme.rs +++ b/core/embed/rust/src/ui/model_tt/bootloader/theme.rs @@ -69,7 +69,9 @@ pub const WARNING40: &[u8] = include_res!("model_tt/res/warning40.toif"); pub const CHECK24: &[u8] = include_res!("model_tt/res/check24.toif"); pub const CHECK40: &[u8] = include_res!("model_tt/res/check40.toif"); -pub const LOGO_EMPTY: &[u8] = include_res!("model_tt/res/trezor_empty.toif"); +pub const LOGO_EMPTY: &[u8] = include_res!("model_tt/res/lock_empty.toif"); +pub const DEVICE_NAME: &[u8] = include_res!("model_tt/res/device_name_T.toif"); +pub const START_URL: &[u8] = include_res!("model_tt/res/start.toif"); pub fn button_confirm() -> ButtonStyleSheet { ButtonStyleSheet { diff --git a/core/embed/rust/src/ui/model_tt/bootloader/welcome.rs b/core/embed/rust/src/ui/model_tt/bootloader/welcome.rs new file mode 100644 index 000000000..3ec205019 --- /dev/null +++ b/core/embed/rust/src/ui/model_tt/bootloader/welcome.rs @@ -0,0 +1,59 @@ +use crate::ui::{ + component::{Component, Event, EventCtx, Never, Pad}, + constant::screen, + display::{self, Font, Icon}, + geometry::{Offset, Rect, TOP_CENTER}, + model_tt::{ + bootloader::theme::{START_URL, WELCOME_COLOR}, + theme::{BLACK, GREY_MEDIUM, WHITE}, + }, +}; + +pub struct Welcome { + bg: Pad, +} + +impl Welcome { + pub fn new() -> Self { + Self { + bg: Pad::with_background(WELCOME_COLOR).with_clear(), + } + } +} + +impl Component for Welcome { + type Msg = Never; + + fn place(&mut self, bounds: Rect) -> Rect { + self.bg.place(screen()); + bounds + } + + fn event(&mut self, _ctx: &mut EventCtx, _event: Event) -> Option { + None + } + + fn paint(&mut self) { + self.bg.paint(); + display::text_center( + screen().top_center() + Offset::y(102), + "Get started with", + Font::NORMAL, + GREY_MEDIUM, + BLACK, + ); + display::text_center( + screen().top_center() + Offset::y(126), + "your Trezor at", + Font::NORMAL, + GREY_MEDIUM, + BLACK, + ); + Icon::new(START_URL).draw( + screen().top_center() + Offset::y(135), + TOP_CENTER, + WHITE, + BLACK, + ); + } +} diff --git a/core/embed/rust/src/ui/model_tt/component/welcome_screen.rs b/core/embed/rust/src/ui/model_tt/component/welcome_screen.rs index 1db1b35ae..7db76a14b 100644 --- a/core/embed/rust/src/ui/model_tt/component/welcome_screen.rs +++ b/core/embed/rust/src/ui/model_tt/component/welcome_screen.rs @@ -1,3 +1,5 @@ +#[cfg(feature = "bootloader")] +use crate::ui::model_tt::bootloader::theme::DEVICE_NAME; use crate::ui::{ component::{Component, Event, EventCtx, Never}, display::{self, Icon}, @@ -33,6 +35,13 @@ impl Component for WelcomeScreen { } fn paint(&mut self) { + Icon::new(theme::ICON_LOGO).draw( + self.area.top_center() + Offset::y(ICON_TOP_MARGIN), + geometry::TOP_CENTER, + theme::FG, + theme::BG, + ); + #[cfg(not(feature = "bootloader"))] display::text_center( self.area.bottom_center() - Offset::y(TEXT_BOTTOM_MARGIN), MODEL_NAME, @@ -40,9 +49,10 @@ impl Component for WelcomeScreen { theme::FG, theme::BG, ); - Icon::new(theme::ICON_LOGO).draw( - self.area.top_center() + Offset::y(ICON_TOP_MARGIN), - geometry::TOP_CENTER, + #[cfg(feature = "bootloader")] + Icon::new(DEVICE_NAME).draw( + self.area.bottom_center() - Offset::y(TEXT_BOTTOM_MARGIN) + Offset::y(1), + geometry::BOTTOM_CENTER, theme::FG, theme::BG, ); diff --git a/core/embed/rust/src/ui/model_tt/res/device_name_T.toif b/core/embed/rust/src/ui/model_tt/res/device_name_T.toif new file mode 100644 index 0000000000000000000000000000000000000000..397bffd9d9b802b837386403480261a7d145ceec GIT binary patch literal 555 zcmV+`0@VFfPf16T01yBl0ssJg($8xXK@EZ> z^X9|M+udkN;Qvu>HWg5BzDdo!tEQ7gsP;%=3REG=18vf&xsH=g62aN`BH#0-Lnd%E z1@gRDd-wTa6_^g$z+ei*t9J6h(8k406YE|TCAsgZB*pvr&3S=h2UZ+2^x*pnx2y7P z<&gKkkdg_g=hN9b-}H1@?rSXba1Mb_HwF5&#lyaa6>%$oK2hXAs*4#AeV*;M?hKxn zwzp5n==qN#7Xf{_B+yGzZ)sO!hn^0|sL-ne_PTm;u$2MvL{z{U@zGBlL`8fgBXEa3 zTBLlZwWHB>P$KgK*MttjB9_URgf62@*A^a9j+bZ3{KvnbHiUAq*{v}Ya(QS=dEi)d zec>MECLtS1cUb7Tyw`w5`4Mz%hqgckDU`h(h9vS?P>CKl8VyzF7T#j7l!Ag)nic4b zY?1OqhMsV>kp)@t46HdEX~m~8xn0HxYV%1M>ecwg723W+pWA3kbrytUXYQxAVrOYd zh3@UX#t7oCK{51$u70Iloo+mnx8|xntumoqzV!J@(x@aILuG1#Az5>iuZf{G9`9zK t$ofq!HH54Ir(+0lO(1+CKM%Yny~q0xsAc>OjpKsKN>gz~jmLjW{s3C86Z8N8 literal 0 HcmV?d00001 diff --git a/core/embed/rust/src/ui/model_tt/res/lock_empty.toif b/core/embed/rust/src/ui/model_tt/res/lock_empty.toif new file mode 100644 index 0000000000000000000000000000000000000000..96836d2d28ce17d17ca91995cd70625fbc1a51a3 GIT binary patch literal 546 zcmV+-0^R*oPf15e0BHag0ssK*lFv&UK@`W|t}(H+nmtLplm(%!2QgO z&fd+{`w&b13LmCe+tl|LrnOvW^M4ZLIG~@}`{e1A>9qD^%zR@4MA!+&H3Ow39oey6 z%uLWfMmk13B99X^v_ngIURfn;35lPj2N>s-Q_^7pDO>8t0`LxVsIt>1ccvZeL0O8fL)Rt=$}~~nw^8UBjexmJMzBgYt_qC#)m((b^l`+9L+DaBanEpsY zFEN^~!j*id@8q1vQ1+@A(jXTxAy1XV3i5kcsvxu4mZ`0sngEHGaUY)cLR!$ju@2%Z k8M7VWvt*e79ZwP$yCDA^ooOMtu1E{YwC+N$*i9;>TViMc^#A|> literal 0 HcmV?d00001 diff --git a/core/embed/rust/src/ui/model_tt/res/lock_full.toif b/core/embed/rust/src/ui/model_tt/res/lock_full.toif new file mode 100644 index 0000000000000000000000000000000000000000..5e1a79583cc17d17bd9bfe153ae5a33477b1e7d7 GIT binary patch literal 393 zcmV;40e1dWPf15e0BHby0RRB)(mzYYFc=2#q?8j8v>=EslGQ<12OV_O#Sh?Mzknd_ zcZYre9dy-0XF&&Xy}=J4C@Q#|2y*Ch4r0AK>udj{ZJIZ2)Y-Q~xUfTQtw<48{preovl8Mf1hW8jS|`%^x>J(~r9rpCt3~f*5~qHYsj-LD3<% z(hHG%NI2??xLM1Z&$t;u+Zsl12^;%}8*vwLGiJ;A<7tIj4{RxhM7^36VRfa zU&+9fOb!5NHBT-lKl6J3ZARbWDZmus0Q{)7+HVJtlkTM!m|UM)9?KD7h(V nu0^sy)H%$^A}PvgLRJXTpkRt+*$pRLPJ#*h9UTeK1gic3A8)b+ literal 0 HcmV?d00001 diff --git a/core/embed/rust/src/ui/model_tt/res/logo.toif b/core/embed/rust/src/ui/model_tt/res/logo.toif deleted file mode 100644 index fa80ed960999ca820fadaa95b9a8293045dd5a0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437 zcmV;m0ZRTGVSCb{uBa=##^NBktHATAo@2tsnRIbLRShJWo}T&EJ3zW%AjgmvMC2ILoC!%O+g|C z5*ZN9BW319^Fx`M*Q*|0_;uWEuI#ol3b6ic-wnIXCoA`?gZpB)Tg2xy*-7eM^@A4J za}#!P&59T|MXPBz17Rr%a(rM4A@8E|UXInL1rMq_RehuYmF- f0k|bcNs2QztKgmEU;@w|gGGP<#7@yKC6)XF9c$FW diff --git a/core/embed/rust/src/ui/model_tt/res/start.toif b/core/embed/rust/src/ui/model_tt/res/start.toif new file mode 100644 index 0000000000000000000000000000000000000000..cd43311633d548e7cafc90805c4036a24079f3e3 GIT binary patch literal 641 zcmV-{0)G8ePf16J02Kgr0ssJ|l21q!aTLeDyRK{QA6lqOhhPHhP^>NlL3D6JiwL9W z6iB!yi40~1PeQoI#SSCUC8%}}(Rss2Vv$+!lBA46MG-pQqSNfos=Kbvyxwm{*Ok&j z9}M%I_ulU_@4epx{@dh19L^SAHe^xXFKH@#AfvQ<&{Dnk`wLC+SRn}1j~~d$jW^_a zxA(4fHN_=5_D@EWZASNDOgdVBqVTlPB7dI_B3~#JhQRV17daxz%s&C1Exqt_)zpr6 zOGB8nwIK}uVAtC#Q~k3v9a<$)WO67_B{KXaB2wW>iJe?#DT@?4wi6)LhSQnrW& zV40*iM9~>r?~}=#@1e)9DO{YJBPB_%K2lU-XV7I-Xnf1?AxAz-zqX;y*v6wIUH)qN zEL!gSMDrmr51B&98-CPogMS(-QVTW)Bs%ThOBS2mn4mT+=vW&->YkWKGQ){27L#{o zDpL?8t+#iLFR!YjoCQA;x9>41jF=NfMM2pZJ?qVM`1uD4SXu00SllX!-sA2btmtk~ zFkIn8#L+b8oDw3zV_=55mr>R-namATxFvxvX$^+B55d@s0C#8YtY9pd58nLASkZtp ze#znLmZyu-K|;AKz*19k4O)uQdor`BCYjz7ncH+kX6;P5)Bd0O6{ zN6eupa*oGH+tde-;mTbGzL6fl3X9k;GTSiWsIfZT@)-ESjD{sn{7t%ckym|H5vs@U bd14(ngw?xnWV0hjMkILKk7`n{Z{OH&i1IZ7 literal 0 HcmV?d00001 diff --git a/core/embed/rust/src/ui/model_tt/theme.rs b/core/embed/rust/src/ui/model_tt/theme.rs index d0cfb3e7c..82a9cba84 100644 --- a/core/embed/rust/src/ui/model_tt/theme.rs +++ b/core/embed/rust/src/ui/model_tt/theme.rs @@ -98,7 +98,7 @@ pub const IMAGE_BG_BACK_BTN: &[u8] = include_res!("model_tt/res/bg-back40.toif") pub const IMAGE_BG_BACK_BTN_TALL: &[u8] = include_res!("model_tt/res/bg-back52.toif"); // Welcome screen. -pub const ICON_LOGO: &[u8] = include_res!("model_tt/res/logo.toif"); +pub const ICON_LOGO: &[u8] = include_res!("model_tt/res/lock_full.toif"); // Default homescreen pub const IMAGE_HOMESCREEN: &[u8] = include_res!("model_tt/res/bg.jpg"); diff --git a/core/embed/trezorhal/displays/st7789v.c b/core/embed/trezorhal/displays/st7789v.c index 59629dd07..ae6f54000 100644 --- a/core/embed/trezorhal/displays/st7789v.c +++ b/core/embed/trezorhal/displays/st7789v.c @@ -647,20 +647,18 @@ void display_reinit(void) { // important for model T as this is not set in boardloader display_set_little_endian(); - // enable PWM timer - TIM_HandleTypeDef TIM1_Handle; - TIM1_Handle.Instance = TIM1; - TIM1_Handle.Init.Period = LED_PWM_TIM_PERIOD - 1; - // TIM1/APB2 source frequency equals to SystemCoreClock in our configuration, - // we want 1 MHz - TIM1_Handle.Init.Prescaler = SystemCoreClock / 1000000 - 1; - TIM1_Handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - TIM1_Handle.Init.CounterMode = TIM_COUNTERMODE_UP; - TIM1_Handle.Init.RepetitionCounter = 0; - HAL_TIM_PWM_Init(&TIM1_Handle); + uint32_t prev_arr = TIM1->ARR; + uint32_t prev_ccr1 = TIM1->CCR1; + + uint8_t prev_val = (prev_ccr1 * 255) / prev_arr; + DISPLAY_BACKLIGHT = prev_val; + DISPLAY_ORIENTATION = 0; pwm_period = LED_PWM_TIM_PERIOD; - display_backlight(DISPLAY_BACKLIGHT); + TIM1->CR1 |= TIM_CR1_ARPE; + TIM1->CR2 |= TIM_CR2_CCPC; + TIM1->CCR1 = pwm_period * prev_val / 255; + TIM1->ARR = LED_PWM_TIM_PERIOD - 1; } void display_sync(void) { @@ -678,20 +676,16 @@ void display_sync(void) { void display_refresh(void) {} void display_set_slow_pwm(void) { - // enable PWM timer - TIM_HandleTypeDef TIM1_Handle; - TIM1_Handle.Instance = TIM1; - TIM1_Handle.Init.Period = LED_PWM_SLOW_TIM_PERIOD - 1; - // TIM1/APB2 source frequency equals to SystemCoreClock in our configuration, - // we want 1 MHz - TIM1_Handle.Init.Prescaler = SystemCoreClock / 1000000 - 1; - TIM1_Handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - TIM1_Handle.Init.CounterMode = TIM_COUNTERMODE_UP; - TIM1_Handle.Init.RepetitionCounter = 0; - HAL_TIM_PWM_Init(&TIM1_Handle); + uint32_t prev_arr = TIM1->ARR; + uint32_t prev_ccr1 = TIM1->CCR1; + + uint8_t prev_val = (prev_ccr1 * 255) / prev_arr; pwm_period = LED_PWM_SLOW_TIM_PERIOD; - display_backlight(DISPLAY_BACKLIGHT); + TIM1->CR1 |= TIM_CR1_ARPE; + TIM1->CR2 |= TIM_CR2_CCPC; + TIM1->ARR = LED_PWM_SLOW_TIM_PERIOD - 1; + TIM1->CCR1 = pwm_period * prev_val / 255; } void display_set_little_endian(void) { diff --git a/core/src/boot.py b/core/src/boot.py index 4a88da4d5..e9a668939 100644 --- a/core/src/boot.py +++ b/core/src/boot.py @@ -21,7 +21,7 @@ from trezor.ui.layouts.homescreen import Lockscreen from apps.common.request_pin import can_lock_device, verify_user_pin -_WELCOME_SCREEN_MS = 1500 # how long do we want to show welcome screen (minimum) +_WELCOME_SCREEN_MS = 1200 # how long do we want to show welcome screen (minimum) def enforce_welcome_screen_duration() -> None: