From 4009a0fd2aa81c00e5c21c84515e7e68f5e32442 Mon Sep 17 00:00:00 2001 From: tychovrahe Date: Fri, 14 Oct 2022 12:43:37 +0200 Subject: [PATCH] feat(core): change display type for model R [no changelog] --- core/SConscript.boardloader | 4 +- core/SConscript.bootloader | 3 +- core/SConscript.bootloader_ci | 3 +- core/SConscript.firmware | 7 ++- core/SConscript.prodtest | 3 +- core/SConscript.reflash | 3 +- core/SConscript.unix | 5 +- core/embed/bootloader/main.c | 1 + core/embed/extmod/modtrezorui/buffers.h | 4 +- core/embed/extmod/modtrezorui/display.h | 2 +- .../extmod/modtrezorui/display_interface.h | 32 ++---------- core/embed/firmware/main.c | 1 + core/embed/rust/build.rs | 14 +++++ core/embed/rust/trezorhal.h | 1 + core/embed/trezorhal/boards/trezor_1.h | 33 ++++++++++++ core/embed/trezorhal/boards/trezor_r_v3.h | 13 +++++ core/embed/trezorhal/boards/trezor_r_v4.h | 33 ++++++++++++ core/embed/trezorhal/boards/trezor_t.h | 6 +++ core/embed/trezorhal/button.c | 19 +------ .../displays/st7789v.c} | 2 +- core/embed/trezorhal/displays/st7789v.h | 25 +++++++++ .../displays/ug-2828tswig01.c} | 2 +- .../embed/trezorhal/displays/ug-2828tswig01.h | 10 ++++ .../displays/vg-2864ksweg01.c} | 51 ++++++++++--------- .../embed/trezorhal/displays/vg-2864ksweg01.h | 13 +++++ core/embed/unix/board-unix.h | 6 +++ .../modtrezorui => unix}/display-unix.c | 2 +- core/embed/unix/display-unix.h | 33 ++++++++++++ core/site_scons/tools.py | 26 +++++++++- 29 files changed, 269 insertions(+), 88 deletions(-) create mode 100644 core/embed/trezorhal/boards/trezor_1.h create mode 100644 core/embed/trezorhal/boards/trezor_r_v3.h create mode 100644 core/embed/trezorhal/boards/trezor_r_v4.h create mode 100644 core/embed/trezorhal/boards/trezor_t.h rename core/embed/{extmod/modtrezorui/display-stm32_T.c => trezorhal/displays/st7789v.c} (99%) create mode 100644 core/embed/trezorhal/displays/st7789v.h rename core/embed/{extmod/modtrezorui/display-stm32_R.c => trezorhal/displays/ug-2828tswig01.c} (99%) create mode 100644 core/embed/trezorhal/displays/ug-2828tswig01.h rename core/embed/{extmod/modtrezorui/display-stm32_1.c => trezorhal/displays/vg-2864ksweg01.c} (88%) create mode 100644 core/embed/trezorhal/displays/vg-2864ksweg01.h create mode 100644 core/embed/unix/board-unix.h rename core/embed/{extmod/modtrezorui => unix}/display-unix.c (99%) create mode 100644 core/embed/unix/display-unix.h diff --git a/core/SConscript.boardloader b/core/SConscript.boardloader index d85201f784..de31c8c711 100644 --- a/core/SConscript.boardloader +++ b/core/SConscript.boardloader @@ -1,6 +1,7 @@ # pylint: disable=E0602 import os +import tools TREZOR_MODEL = ARGUMENTS.get('TREZOR_MODEL', 'T') @@ -51,7 +52,6 @@ CPPPATH_MOD += [ SOURCE_MOD += [ 'embed/extmod/modtrezorui/display.c', 'embed/extmod/modtrezorui/colors.c', - f'embed/extmod/modtrezorui/display-stm32_{TREZOR_MODEL}.c', 'embed/extmod/modtrezorui/fonts/fonts.c', 'embed/extmod/modtrezorui/fonts/font_bitmap.c', ] @@ -101,6 +101,8 @@ SOURCE_TREZORHAL = [ env = Environment(ENV=os.environ, CFLAGS='%s -DPRODUCTION=%s' % (ARGUMENTS.get('CFLAGS', ''), ARGUMENTS.get('PRODUCTION', '0'))) +tools.configure_board(TREZOR_MODEL, env, CPPDEFINES_MOD, SOURCE_TREZORHAL) + env.Replace( AS='arm-none-eabi-as', AR='arm-none-eabi-ar', diff --git a/core/SConscript.bootloader b/core/SConscript.bootloader index 34deef7241..d18e8ea8f6 100644 --- a/core/SConscript.bootloader +++ b/core/SConscript.bootloader @@ -72,7 +72,6 @@ SOURCE_MOD += [ 'embed/extmod/modtrezorui/buffers.c', 'embed/extmod/modtrezorui/colors.c', 'embed/extmod/modtrezorui/display.c', - f'embed/extmod/modtrezorui/display-stm32_{TREZOR_MODEL}.c', 'embed/extmod/modtrezorui/fonts/fonts.c', 'embed/extmod/modtrezorui/fonts/font_bitmap.c', 'vendor/micropython/lib/uzlib/adler32.c', @@ -158,6 +157,8 @@ tools.add_font('MONO', FONT_MONO, CPPDEFINES_MOD, SOURCE_MOD) env = Environment(ENV=os.environ, CFLAGS='%s -DPRODUCTION=%s' % (ARGUMENTS.get('CFLAGS', ''), ARGUMENTS.get('PRODUCTION', '0'))) +tools.configure_board(TREZOR_MODEL, env, CPPDEFINES_MOD, SOURCE_TREZORHAL) + env.Replace( AS='arm-none-eabi-as', AR='arm-none-eabi-ar', diff --git a/core/SConscript.bootloader_ci b/core/SConscript.bootloader_ci index d2a5366f62..f7b99791d9 100644 --- a/core/SConscript.bootloader_ci +++ b/core/SConscript.bootloader_ci @@ -66,7 +66,6 @@ CPPPATH_MOD += [ SOURCE_MOD += [ 'embed/extmod/modtrezorui/display.c', 'embed/extmod/modtrezorui/colors.c', - f'embed/extmod/modtrezorui/display-stm32_{TREZOR_MODEL}.c', 'embed/extmod/modtrezorui/fonts/fonts.c', 'embed/extmod/modtrezorui/fonts/font_bitmap.c', 'vendor/micropython/lib/uzlib/adler32.c', @@ -138,6 +137,8 @@ tools.add_font('MONO', FONT_MONO, CPPDEFINES_MOD, SOURCE_MOD) env = Environment(ENV=os.environ, CFLAGS='%s -DPRODUCTION=%s' % (ARGUMENTS.get('CFLAGS', ''), ARGUMENTS.get('PRODUCTION', '0'))) +tools.configure_board(TREZOR_MODEL, env, CPPDEFINES_MOD, SOURCE_TREZORHAL) + env.Replace( AS='arm-none-eabi-as', AR='arm-none-eabi-ar', diff --git a/core/SConscript.firmware b/core/SConscript.firmware index 03d36959c8..3e9febfd87 100644 --- a/core/SConscript.firmware +++ b/core/SConscript.firmware @@ -182,7 +182,6 @@ SOURCE_MOD += [ 'embed/extmod/modtrezorui/buffers.c', 'embed/extmod/modtrezorui/colors.c', 'embed/extmod/modtrezorui/display.c', - f'embed/extmod/modtrezorui/display-stm32_{TREZOR_MODEL}.c', 'embed/extmod/modtrezorui/fonts/fonts.c', 'embed/extmod/modtrezorui/fonts/font_bitmap.c', 'embed/extmod/modtrezorui/modtrezorui.c', @@ -449,6 +448,8 @@ SOURCE_QSTR = SOURCE_MOD + SOURCE_MICROPYTHON + SOURCE_MICROPYTHON_SPEED env = Environment(ENV=os.environ, CFLAGS='%s -DPRODUCTION=%s -DPYOPT=%s -DBITCOIN_ONLY=%s' % (ARGUMENTS.get('CFLAGS', ''), ARGUMENTS.get('PRODUCTION', '0'), PYOPT, BITCOIN_ONLY)) +tools.configure_board(TREZOR_MODEL, env, CPPDEFINES_MOD, SOURCE_TREZORHAL) + env.Tool('micropython') env.Replace( @@ -464,7 +465,7 @@ env.Replace( OBJCOPY='arm-none-eabi-objcopy', ) env.Replace( - TREZOR_MODEL=TREZOR_MODEL, ) + TREZOR_MODEL=TREZOR_MODEL,) if TREZOR_MODEL in ('T', 'R'): CPU_ASFLAGS = '-mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16' @@ -781,6 +782,8 @@ def cargo_build(): '-Z build-std-features=panic_immediate_abort', ] + env.get('ENV')['TREZOR_MODEL'] = TREZOR_MODEL + return f'cd embed/rust; cargo build {profile} ' + ' '.join(cargo_opts) rust = env.Command( diff --git a/core/SConscript.prodtest b/core/SConscript.prodtest index 5d1effbbdd..ba19d4dd19 100644 --- a/core/SConscript.prodtest +++ b/core/SConscript.prodtest @@ -41,7 +41,6 @@ CPPPATH_MOD += [ SOURCE_MOD += [ 'embed/extmod/modtrezorui/display.c', 'embed/extmod/modtrezorui/colors.c', - f'embed/extmod/modtrezorui/display-stm32_{TREZOR_MODEL}.c', 'embed/extmod/modtrezorui/fonts/fonts.c', 'embed/extmod/modtrezorui/fonts/font_bitmap.c', 'embed/extmod/modtrezorui/qr-code-generator/qrcodegen.c', @@ -107,6 +106,8 @@ tools.add_font('MONO', FONT_MONO, CPPDEFINES_MOD, SOURCE_MOD) env = Environment(ENV=os.environ, CFLAGS='%s -DPRODUCTION=%s' % (ARGUMENTS.get('CFLAGS', ''), ARGUMENTS.get('PRODUCTION', '0'))) +tools.configure_board(TREZOR_MODEL, env, CPPDEFINES_MOD, SOURCE_TREZORHAL) + env.Replace( AS='arm-none-eabi-as', AR='arm-none-eabi-ar', diff --git a/core/SConscript.reflash b/core/SConscript.reflash index 2b55646486..e10b523115 100644 --- a/core/SConscript.reflash +++ b/core/SConscript.reflash @@ -36,7 +36,6 @@ CPPPATH_MOD += [ SOURCE_MOD += [ 'embed/extmod/modtrezorui/display.c', 'embed/extmod/modtrezorui/colors.c', - f'embed/extmod/modtrezorui/display-stm32_{TREZOR_MODEL}.c', 'embed/extmod/modtrezorui/fonts/fonts.c', 'embed/extmod/modtrezorui/font_bitmap.c', 'vendor/micropython/lib/uzlib/adler32.c', @@ -100,6 +99,8 @@ tools.add_font('MONO', FONT_MONO, CPPDEFINES_MOD, SOURCE_MOD) env = Environment(ENV=os.environ, CFLAGS='%s -DPRODUCTION=%s' % (ARGUMENTS.get('CFLAGS', ''), ARGUMENTS.get('PRODUCTION', '0'))) +tools.configure_board(TREZOR_MODEL, env, CPPDEFINES_MOD, SOURCE_TREZORHAL) + env.Replace( AS='arm-none-eabi-as', AR='arm-none-eabi-ar', diff --git a/core/SConscript.unix b/core/SConscript.unix index 5a752da11c..06bcd05398 100644 --- a/core/SConscript.unix +++ b/core/SConscript.unix @@ -178,7 +178,6 @@ SOURCE_MOD += [ 'embed/extmod/modtrezorui/buffers.c', 'embed/extmod/modtrezorui/colors.c', 'embed/extmod/modtrezorui/display.c', - 'embed/extmod/modtrezorui/display-unix.c', 'embed/extmod/modtrezorui/fonts/fonts.c', 'embed/extmod/modtrezorui/fonts/font_bitmap.c', 'embed/extmod/modtrezorui/modtrezorui.c', @@ -348,6 +347,7 @@ SOURCE_MICROPYTHON = [ SOURCE_UNIX = [ 'embed/unix/common.c', + 'embed/unix/display-unix.c', 'embed/unix/flash.c', 'embed/unix/main.c', 'embed/unix/main_main.c', @@ -460,6 +460,7 @@ env.Replace( CPPDEFINES=[ 'TREZOR_EMULATOR', 'TREZOR_MODEL_'+TREZOR_MODEL, + 'TREZOR_BOARD=\\"board-unix.h\\"', ('MP_CONFIGFILE', '\\"embed/unix/mpconfigport.h\\"'), ] + CPPDEFINES_MOD, ASPPFLAGS='$CFLAGS $CCFLAGS', ) @@ -726,6 +727,8 @@ def cargo_build(): if DMA2D: features.append('dma2d') + env.get('ENV')['TREZOR_MODEL'] = TREZOR_MODEL + return f'cd embed/rust; cargo build --profile {RUST_PROFILE} --target-dir=../../build/unix/rust --no-default-features --features "{" ".join(features)}" --target {TARGET}' rust = env.Command( diff --git a/core/embed/bootloader/main.c b/core/embed/bootloader/main.c index 166a3e5d64..cfe3f7347c 100644 --- a/core/embed/bootloader/main.c +++ b/core/embed/bootloader/main.c @@ -285,6 +285,7 @@ int main(void) { #endif #if defined TREZOR_MODEL_R + display_init(); button_init(); rgb_led_init(); #endif diff --git a/core/embed/extmod/modtrezorui/buffers.h b/core/embed/extmod/modtrezorui/buffers.h index 5acd07df12..89f284d837 100644 --- a/core/embed/extmod/modtrezorui/buffers.h +++ b/core/embed/extmod/modtrezorui/buffers.h @@ -23,7 +23,7 @@ #include #include "common.h" -#include "display_defs.h" +#include TREZOR_BOARD #define BUFFER_PIXELS DISPLAY_RESX @@ -56,4 +56,4 @@ line_buffer_16bpp_t* buffers_get_line_buffer_16bpp(uint16_t idx, bool clear); line_buffer_4bpp_t* buffers_get_line_buffer_4bpp(uint16_t idx, bool clear); buffer_text_t* buffers_get_text_buffer(uint16_t idx, bool clear); -#endif //_BUFFERS_H +#endif // _BUFFERS_H diff --git a/core/embed/extmod/modtrezorui/display.h b/core/embed/extmod/modtrezorui/display.h index cc2a1f55cb..4c946cf879 100644 --- a/core/embed/extmod/modtrezorui/display.h +++ b/core/embed/extmod/modtrezorui/display.h @@ -26,7 +26,7 @@ #include "buffers.h" #include "colors.h" -#include "display_defs.h" +#include TREZOR_BOARD #include "display_interface.h" #include "fonts/fonts.h" diff --git a/core/embed/extmod/modtrezorui/display_interface.h b/core/embed/extmod/modtrezorui/display_interface.h index bd0a804df4..880279de54 100644 --- a/core/embed/extmod/modtrezorui/display_interface.h +++ b/core/embed/extmod/modtrezorui/display_interface.h @@ -22,36 +22,15 @@ #include #include "common.h" +#include TREZOR_BOARD -#if !defined TREZOR_EMULATOR -#include STM32_HAL_H -#endif - -#if (defined TREZOR_MODEL_T) && !(defined TREZOR_EMULATOR) - -extern __IO uint8_t *const DISPLAY_CMD_ADDRESS; -extern __IO uint8_t *const DISPLAY_DATA_ADDRESS; - -#define CMD(X) (*DISPLAY_CMD_ADDRESS = (X)) -#define DATA(X) (*DISPLAY_DATA_ADDRESS = (X)) -#define PIXELDATA(X) \ - DATA((X)&0xFF); \ - DATA((X) >> 8) - -#else +#ifndef PIXELDATA #define PIXELDATA(c) display_pixeldata(c) #endif -#ifdef TREZOR_EMULATOR -extern uint8_t *const DISPLAY_DATA_ADDRESS; -#endif - void display_pixeldata(uint16_t c); -#if (defined TREZOR_MODEL_1) && !(defined TREZOR_EMULATOR) -void PIXELDATA_DIRTY(); -#else -// noop +#ifndef PIXELDATA_DIRTY #define PIXELDATA_DIRTY() #endif @@ -67,9 +46,4 @@ void display_refresh(void); const char *display_save(const char *prefix); void display_clear_save(void); -#ifdef TREZOR_MODEL_T -void display_set_little_endian(void); -void display_set_big_endian(void); -#endif - #endif //_DISPLAY_INTERFACE_H diff --git a/core/embed/firmware/main.c b/core/embed/firmware/main.c index 9a89bd597b..ef0ee931c8 100644 --- a/core/embed/firmware/main.c +++ b/core/embed/firmware/main.c @@ -115,6 +115,7 @@ int main(void) { #endif #if defined TREZOR_MODEL_R + display_init(); button_init(); display_clear(); rgb_led_init(); diff --git a/core/embed/rust/build.rs b/core/embed/rust/build.rs index 58c50c42b9..d8f51ec56c 100644 --- a/core/embed/rust/build.rs +++ b/core/embed/rust/build.rs @@ -19,6 +19,19 @@ fn model() -> String { } } +fn board() -> String { + if !is_firmware() { + return String::from("board-unix.h"); + } + + match env::var("TREZOR_BOARD") { + Ok(board) => { + format!("boards/{}", board) + } + Err(_) => String::from("boards/trezor_t.h"), + } +} + /// Generates Rust module that exports QSTR constants used in firmware. #[cfg(feature = "micropython")] fn generate_qstr_bindings() { @@ -64,6 +77,7 @@ fn prepare_bindings() -> bindgen::Builder { "-I../../vendor/micropython/lib/uzlib", "-I../extmod/modtrezorui", // for display.h format!("-DTREZOR_MODEL_{}", model()).as_str(), + format!("-DTREZOR_BOARD=\"{}\"", board()).as_str(), ]); // Pass in correct include paths and defines. diff --git a/core/embed/rust/trezorhal.h b/core/embed/rust/trezorhal.h index c64b015e1f..82965b58b2 100644 --- a/core/embed/rust/trezorhal.h +++ b/core/embed/rust/trezorhal.h @@ -1,3 +1,4 @@ +#include TREZOR_BOARD #include "buffers.h" #include "button.h" #include "common.h" diff --git a/core/embed/trezorhal/boards/trezor_1.h b/core/embed/trezorhal/boards/trezor_1.h new file mode 100644 index 0000000000..56945255ee --- /dev/null +++ b/core/embed/trezorhal/boards/trezor_1.h @@ -0,0 +1,33 @@ +#ifndef _TREZOR_1_H +#define _TREZOR_1_H + +#include "displays/vg-2864ksweg01.h" + +#define BTN_LEFT_PIN GPIO_PIN_5 +#define BTN_LEFT_PORT GPIOC +#define BTN_LEFT_CLK_ENA __HAL_RCC_GPIOC_CLK_ENABLE +#define BTN_RIGHT_PIN GPIO_PIN_2 +#define BTN_RIGHT_PORT GPIOC +#define BTN_RIGHT_CLK_ENA __HAL_RCC_GPIOC_CLK_ENABLE + +#define OLED_DC_PORT GPIOB +#define OLED_DC_PIN GPIO_PIN_0 // PB0 | Data/Command +#define OLED_DC_CLK_ENA __HAL_RCC_GPIOB_CLK_ENABLE +#define OLED_CS_PORT GPIOA +#define OLED_CS_PIN GPIO_PIN_4 // PA4 | SPI Select +#define OLED_CS_CLK_ENA __HAL_RCC_GPIOA_CLK_ENABLE +#define OLED_RST_PORT GPIOB +#define OLED_RST_PIN GPIO_PIN_1 // PB1 | Reset display +#define OLED_RST_CLK_ENA __HAL_RCC_GPIOB_CLK_ENABLE + +#define OLED_SPI SPI1 +#define OLED_SPI_AF GPIO_AF5_SPI1 +#define OLED_SPI_CLK_ENA __HAL_RCC_SPI1_CLK_ENABLE +#define OLED_SPI_SCK_PORT GPIOA +#define OLED_SPI_SCK_PIN GPIO_PIN_5 // PA5 | SPI SCK +#define OLED_SPI_SCK_CLK_ENA __HAL_RCC_GPIOA_CLK_ENABLE +#define OLED_SPI_MOSI_PORT GPIOA +#define OLED_SPI_MOSI_PIN GPIO_PIN_7 // PA7 | SPI MOSI +#define OLED_SPI_MOSI_CLK_ENA __HAL_RCC_GPIOA_CLK_ENABLE + +#endif //_TREZOR_1_H diff --git a/core/embed/trezorhal/boards/trezor_r_v3.h b/core/embed/trezorhal/boards/trezor_r_v3.h new file mode 100644 index 0000000000..acf524f1d6 --- /dev/null +++ b/core/embed/trezorhal/boards/trezor_r_v3.h @@ -0,0 +1,13 @@ +#ifndef _TREZOR_R_V3_H +#define _TREZOR_R_V3_H + +#include "displays/ug-2828tswig01.h" + +#define BTN_LEFT_PIN GPIO_PIN_0 +#define BTN_LEFT_PORT GPIOA +#define BTN_LEFT_CLK_ENA __HAL_RCC_GPIOA_CLK_ENABLE +#define BTN_RIGHT_PIN GPIO_PIN_15 +#define BTN_RIGHT_PORT GPIOE +#define BTN_RIGHT_CLK_ENA __HAL_RCC_GPIOE_CLK_ENABLE + +#endif //_TREZOR_R_V3_H diff --git a/core/embed/trezorhal/boards/trezor_r_v4.h b/core/embed/trezorhal/boards/trezor_r_v4.h new file mode 100644 index 0000000000..e7ba40ed97 --- /dev/null +++ b/core/embed/trezorhal/boards/trezor_r_v4.h @@ -0,0 +1,33 @@ +#ifndef _TREZOR_R_V4_H +#define _TREZOR_R_V4_H + +#include "displays/vg-2864ksweg01.h" + +#define BTN_LEFT_PIN GPIO_PIN_5 +#define BTN_LEFT_PORT GPIOC +#define BTN_LEFT_CLK_ENA __HAL_RCC_GPIOC_CLK_ENABLE +#define BTN_RIGHT_PIN GPIO_PIN_10 +#define BTN_RIGHT_PORT GPIOB +#define BTN_RIGHT_CLK_ENA __HAL_RCC_GPIOB_CLK_ENABLE + +#define OLED_DC_PORT GPIOD +#define OLED_DC_PIN GPIO_PIN_0 // PD0 | Data/Command +#define OLED_DC_CLK_ENA __HAL_RCC_GPIOD_CLK_ENABLE +#define OLED_CS_PORT GPIOE +#define OLED_CS_PIN GPIO_PIN_4 // PE4 | SPI Select +#define OLED_CS_CLK_ENA __HAL_RCC_GPIOE_CLK_ENABLE +#define OLED_RST_PORT GPIOD +#define OLED_RST_PIN GPIO_PIN_1 // PD1 | Reset display +#define OLED_RST_CLK_ENA __HAL_RCC_GPIOD_CLK_ENABLE + +#define OLED_SPI SPI4 +#define OLED_SPI_AF GPIO_AF5_SPI4 +#define OLED_SPI_CLK_ENA __HAL_RCC_SPI4_CLK_ENABLE +#define OLED_SPI_SCK_PORT GPIOE +#define OLED_SPI_SCK_PIN GPIO_PIN_2 // PE2 | SPI SCK +#define OLED_SPI_SCK_CLK_ENA __HAL_RCC_GPIOE_CLK_ENABLE +#define OLED_SPI_MOSI_PORT GPIOE +#define OLED_SPI_MOSI_PIN GPIO_PIN_6 // PE6 | SPI MOSI +#define OLED_SPI_MOSI_CLK_ENA __HAL_RCC_GPIOE_CLK_ENABLE + +#endif //_TREZOR_R_V4_H diff --git a/core/embed/trezorhal/boards/trezor_t.h b/core/embed/trezorhal/boards/trezor_t.h new file mode 100644 index 0000000000..d5dccf2470 --- /dev/null +++ b/core/embed/trezorhal/boards/trezor_t.h @@ -0,0 +1,6 @@ +#ifndef _TREZOR_T_H +#define _TREZOR_T_H + +#include "displays/st7789v.h" + +#endif //_TREZOR_T_H diff --git a/core/embed/trezorhal/button.c b/core/embed/trezorhal/button.c index a5661b7df8..7555781d4e 100644 --- a/core/embed/trezorhal/button.c +++ b/core/embed/trezorhal/button.c @@ -1,23 +1,6 @@ #include STM32_HAL_H #include "button.h" - -#if defined TREZOR_MODEL_1 -#define BTN_LEFT_PIN GPIO_PIN_5 -#define BTN_LEFT_PORT GPIOC -#define BTN_LEFT_CLK_ENA __HAL_RCC_GPIOC_CLK_ENABLE -#define BTN_RIGHT_PIN GPIO_PIN_2 -#define BTN_RIGHT_PORT GPIOC -#define BTN_RIGHT_CLK_ENA __HAL_RCC_GPIOC_CLK_ENABLE -#elif defined TREZOR_MODEL_R -#define BTN_LEFT_PIN GPIO_PIN_0 -#define BTN_LEFT_PORT GPIOA -#define BTN_LEFT_CLK_ENA __HAL_RCC_GPIOA_CLK_ENABLE -#define BTN_RIGHT_PIN GPIO_PIN_15 -#define BTN_RIGHT_PORT GPIOE -#define BTN_RIGHT_CLK_ENA __HAL_RCC_GPIOE_CLK_ENABLE -#else -#error Unknown Trezor model -#endif +#include TREZOR_BOARD static char last_left = 0, last_right = 0; diff --git a/core/embed/extmod/modtrezorui/display-stm32_T.c b/core/embed/trezorhal/displays/st7789v.c similarity index 99% rename from core/embed/extmod/modtrezorui/display-stm32_T.c rename to core/embed/trezorhal/displays/st7789v.c index d6b5152778..983153e5ed 100644 --- a/core/embed/extmod/modtrezorui/display-stm32_T.c +++ b/core/embed/trezorhal/displays/st7789v.c @@ -18,7 +18,7 @@ */ #include -#include "display_defs.h" +#include TREZOR_BOARD #include "display_interface.h" #include "memzero.h" #include STM32_HAL_H diff --git a/core/embed/trezorhal/displays/st7789v.h b/core/embed/trezorhal/displays/st7789v.h new file mode 100644 index 0000000000..57a15ee802 --- /dev/null +++ b/core/embed/trezorhal/displays/st7789v.h @@ -0,0 +1,25 @@ +#ifndef _ST7789V_H +#define _ST7789V_H + +#include STM32_HAL_H + +// ILI9341V, GC9307 and ST7789V drivers support 240px x 320px display resolution +#define MAX_DISPLAY_RESX 240 +#define MAX_DISPLAY_RESY 320 +#define DISPLAY_RESX 240 +#define DISPLAY_RESY 240 +#define TREZOR_FONT_BPP 4 + +extern __IO uint8_t *const DISPLAY_CMD_ADDRESS; +extern __IO uint8_t *const DISPLAY_DATA_ADDRESS; + +#define CMD(X) (*DISPLAY_CMD_ADDRESS = (X)) +#define DATA(X) (*DISPLAY_DATA_ADDRESS = (X)) +#define PIXELDATA(X) \ + DATA((X)&0xFF); \ + DATA((X) >> 8) + +void display_set_little_endian(void); +void display_set_big_endian(void); + +#endif //_ST7789V_H diff --git a/core/embed/extmod/modtrezorui/display-stm32_R.c b/core/embed/trezorhal/displays/ug-2828tswig01.c similarity index 99% rename from core/embed/extmod/modtrezorui/display-stm32_R.c rename to core/embed/trezorhal/displays/ug-2828tswig01.c index 9d6bd9792c..11088769c3 100644 --- a/core/embed/extmod/modtrezorui/display-stm32_R.c +++ b/core/embed/trezorhal/displays/ug-2828tswig01.c @@ -18,7 +18,7 @@ */ #include -#include "display_defs.h" +#include TREZOR_BOARD #include "display_interface.h" #include "memzero.h" #include STM32_HAL_H diff --git a/core/embed/trezorhal/displays/ug-2828tswig01.h b/core/embed/trezorhal/displays/ug-2828tswig01.h new file mode 100644 index 0000000000..bdc5b432d4 --- /dev/null +++ b/core/embed/trezorhal/displays/ug-2828tswig01.h @@ -0,0 +1,10 @@ +#ifndef _UG_2828TSWIG01_H +#define _UG_2828TSWIG01_H + +#define MAX_DISPLAY_RESX 128 +#define MAX_DISPLAY_RESY 128 +#define DISPLAY_RESX 128 +#define DISPLAY_RESY 128 +#define TREZOR_FONT_BPP 1 + +#endif //_UG_2828TSWIG01_H diff --git a/core/embed/extmod/modtrezorui/display-stm32_1.c b/core/embed/trezorhal/displays/vg-2864ksweg01.c similarity index 88% rename from core/embed/extmod/modtrezorui/display-stm32_1.c rename to core/embed/trezorhal/displays/vg-2864ksweg01.c index 4777a9e4f0..b5a2b6cdb4 100644 --- a/core/embed/extmod/modtrezorui/display-stm32_1.c +++ b/core/embed/trezorhal/displays/vg-2864ksweg01.c @@ -19,7 +19,7 @@ #include #include -#include "display_defs.h" +#include TREZOR_BOARD #include "display_interface.h" #include STM32_HAL_H @@ -49,13 +49,6 @@ #define OLED_SEGREMAP 0xA0 #define OLED_CHARGEPUMP 0x8D -#define OLED_DC_PORT GPIOB -#define OLED_DC_PIN GPIO_PIN_0 // PB0 | Data/Command -#define OLED_CS_PORT GPIOA -#define OLED_CS_PIN GPIO_PIN_4 // PA4 | SPI Select -#define OLED_RST_PORT GPIOB -#define OLED_RST_PIN GPIO_PIN_1 // PB1 | Reset display - static int DISPLAY_BACKLIGHT = -1; static int DISPLAY_ORIENTATION = -1; static uint8_t OLED_BUFFER[OLED_BUFSIZE]; @@ -72,7 +65,7 @@ static struct { } pos; } PIXELWINDOW; -static bool pixeldata_dirty = true; +static bool pixeldata_dirty_flag = true; void display_pixeldata(uint16_t c) { if (PIXELWINDOW.pos.x <= PIXELWINDOW.end.x && @@ -99,7 +92,7 @@ void display_pixeldata(uint16_t c) { void display_reset_state() {} -void PIXELDATA_DIRTY() { pixeldata_dirty = true; } +void pixeldata_dirty(void) { pixeldata_dirty_flag = true; } void display_set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { PIXELWINDOW.start.x = x0; @@ -140,9 +133,12 @@ static inline void spi_send(const uint8_t *data, int len) { } void display_init(void) { - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_SPI1_CLK_ENABLE(); + OLED_DC_CLK_ENA(); + OLED_CS_CLK_ENA(); + OLED_RST_CLK_ENA(); + OLED_SPI_SCK_CLK_ENA(); + OLED_SPI_MOSI_CLK_ENA(); + OLED_SPI_CLK_ENA(); GPIO_InitTypeDef GPIO_InitStructure; @@ -151,22 +147,27 @@ void display_init(void) { GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStructure.Alternate = 0; - GPIO_InitStructure.Pin = GPIO_PIN_4; - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); - HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); - GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_4; - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_4, GPIO_PIN_RESET); - HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); + GPIO_InitStructure.Pin = OLED_CS_PIN; + HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_RESET); + HAL_GPIO_Init(OLED_CS_PORT, &GPIO_InitStructure); + GPIO_InitStructure.Pin = OLED_DC_PIN; + HAL_GPIO_WritePin(OLED_DC_PORT, OLED_DC_PIN, GPIO_PIN_RESET); + HAL_GPIO_Init(OLED_DC_PORT, &GPIO_InitStructure); + GPIO_InitStructure.Pin = OLED_RST_PIN; + HAL_GPIO_WritePin(OLED_RST_PORT, OLED_RST_PIN, GPIO_PIN_RESET); + HAL_GPIO_Init(OLED_RST_PORT, &GPIO_InitStructure); // enable SPI 1 for OLED display GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStructure.Alternate = GPIO_AF5_SPI1; - GPIO_InitStructure.Pin = GPIO_PIN_5 | GPIO_PIN_7; - HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); + GPIO_InitStructure.Alternate = OLED_SPI_AF; + GPIO_InitStructure.Pin = OLED_SPI_SCK_PIN; + HAL_GPIO_Init(OLED_SPI_SCK_PORT, &GPIO_InitStructure); + GPIO_InitStructure.Pin = OLED_SPI_MOSI_PIN; + HAL_GPIO_Init(OLED_SPI_MOSI_PORT, &GPIO_InitStructure); - spi_handle.Instance = SPI1; + spi_handle.Instance = OLED_SPI; spi_handle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; spi_handle.Init.Direction = SPI_DIRECTION_2LINES; spi_handle.Init.CLKPhase = SPI_PHASE_1EDGE; @@ -249,10 +250,10 @@ void display_refresh(void) { OLED_SETHIGHCOLUMN | 0x00, OLED_SETSTARTLINE | 0x00}; - if (!pixeldata_dirty) { + if (!pixeldata_dirty_flag) { return; } - pixeldata_dirty = false; + pixeldata_dirty_flag = false; HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_RESET); // SPI select spi_send(s, 3); diff --git a/core/embed/trezorhal/displays/vg-2864ksweg01.h b/core/embed/trezorhal/displays/vg-2864ksweg01.h new file mode 100644 index 0000000000..8165b22288 --- /dev/null +++ b/core/embed/trezorhal/displays/vg-2864ksweg01.h @@ -0,0 +1,13 @@ +#ifndef _VG_2864KSWEG01_H +#define _VG_2864KSWEG01_H + +#define MAX_DISPLAY_RESX 128 +#define MAX_DISPLAY_RESY 64 +#define DISPLAY_RESX 128 +#define DISPLAY_RESY 64 +#define TREZOR_FONT_BPP 1 + +void pixeldata_dirty(void); +#define PIXELDATA_DIRTY() pixeldata_dirty(); + +#endif //_VG_2864KSWEG01_H diff --git a/core/embed/unix/board-unix.h b/core/embed/unix/board-unix.h new file mode 100644 index 0000000000..293e205513 --- /dev/null +++ b/core/embed/unix/board-unix.h @@ -0,0 +1,6 @@ +#ifndef _BOARD_UNIX_H +#define _BOARD_UNIX_H + +#include "display-unix.h" + +#endif //_BOARD_UNIX_H diff --git a/core/embed/extmod/modtrezorui/display-unix.c b/core/embed/unix/display-unix.c similarity index 99% rename from core/embed/extmod/modtrezorui/display-unix.c rename to core/embed/unix/display-unix.c index 20cd468110..9c20da6f15 100644 --- a/core/embed/extmod/modtrezorui/display-unix.c +++ b/core/embed/unix/display-unix.c @@ -29,7 +29,7 @@ #include #include "common.h" -#include "display_defs.h" +#include "display-unix.h" #include "display_interface.h" #include "profile.h" diff --git a/core/embed/unix/display-unix.h b/core/embed/unix/display-unix.h new file mode 100644 index 0000000000..d6cf2cc6b7 --- /dev/null +++ b/core/embed/unix/display-unix.h @@ -0,0 +1,33 @@ +#ifndef _DISPLAY_UNIX_H +#define _DISPLAY_UNIX_H + +#include + +#ifdef TREZOR_MODEL_T +// ILI9341V, GC9307 and ST7789V drivers support 240px x 320px display resolution +#define MAX_DISPLAY_RESX 240 +#define MAX_DISPLAY_RESY 320 +#define DISPLAY_RESX 240 +#define DISPLAY_RESY 240 +#define TREZOR_FONT_BPP 4 +#endif + +#ifdef TREZOR_MODEL_R +#define MAX_DISPLAY_RESX 128 +#define MAX_DISPLAY_RESY 64 +#define DISPLAY_RESX 128 +#define DISPLAY_RESY 64 +#define TREZOR_FONT_BPP 1 +#endif + +#ifdef TREZOR_MODEL_1 +#define MAX_DISPLAY_RESX 128 +#define MAX_DISPLAY_RESY 64 +#define DISPLAY_RESX 128 +#define DISPLAY_RESY 64 +#define TREZOR_FONT_BPP 1 +#endif + +extern uint8_t *const DISPLAY_DATA_ADDRESS; + +#endif //_DISPLAY_UNIX_H diff --git a/core/site_scons/tools.py b/core/site_scons/tools.py index 3c2aeec6db..1890841383 100644 --- a/core/site_scons/tools.py +++ b/core/site_scons/tools.py @@ -1,11 +1,33 @@ - def add_font(font_name, font, defines, sources): if font is not None: defines += [ 'TREZOR_FONT_' + font_name + '_ENABLE=' + font, 'TREZOR_FONT_' + font_name + '_INCLUDE=\\"' + font.lower() + '.h\\"', - ] + ] sourcefile = 'embed/extmod/modtrezorui/fonts/' + font.lower() + '.c' if sourcefile not in sources: sources.append(sourcefile) + +def configure_board(model, env, defines, sources): + model_r_version = 3 + + if model in ('1',): + board = 'trezor_1.h' + display = 'vg-2864ksweg01.c' + elif model in ('T',): + board = 'trezor_t.h' + display = 'st7789v.c' + elif model in ('R',): + if model_r_version == 3: + board = 'trezor_r_v3.h' + display = "vg-2828tswig01.c" + else: + board = 'trezor_r_v4.h' + display = 'vg-2864ksweg01.c' + else: + raise Exception("Unknown model") + + defines += [f'TREZOR_BOARD=\\"boards/{board}\\"', ] + sources += [f'embed/trezorhal/displays/{display}', ] + env.get('ENV')['TREZOR_BOARD'] = board