From 915d4fca948f489bf537d8d3206d4eb2f413d4ed Mon Sep 17 00:00:00 2001 From: tychovrahe Date: Fri, 27 Sep 2024 09:09:41 +0200 Subject: [PATCH] feat(core): add support for T3W1, on F4 [no changelog] --- core/Makefile | 4 + .../embed/models/T3W1/boards/trezor_t3w1_d1.h | 82 +++++++++++++ .../T3W1/bootloaders/bootloader_T3W1.bin | Bin 0 -> 118784 bytes .../T3W1/bootloaders/bootloader_hashes.h | 13 +++ core/embed/models/T3W1/memory.ld | 52 +++++++++ core/embed/models/T3W1/model_T3W1.h | 99 ++++++++++++++++ .../vendorheader/vendor_dev_DO_NOT_SIGN.json | 20 ++++ .../vendorheader/vendor_dev_DO_NOT_SIGN.toif | Bin 0 -> 791 bytes ...endorheader_dev_DO_NOT_SIGN_signed_dev.bin | Bin 0 -> 1024 bytes .../vendorheader_dev_DO_NOT_SIGN_unsigned.bin | Bin 0 -> 1024 bytes core/embed/models/T3W1/versions.h | 3 + core/embed/models/model.h | 2 + core/embed/models/model_version.h | 2 + core/site_scons/models/T3W1/__init__.py | 37 ++++++ core/site_scons/models/T3W1/trezor_t3w1_d1.py | 109 ++++++++++++++++++ python/src/trezorlib/firmware/models.py | 17 ++- python/src/trezorlib/models.py | 11 +- 17 files changed, 447 insertions(+), 4 deletions(-) create mode 100644 core/embed/models/T3W1/boards/trezor_t3w1_d1.h create mode 100755 core/embed/models/T3W1/bootloaders/bootloader_T3W1.bin create mode 100644 core/embed/models/T3W1/bootloaders/bootloader_hashes.h create mode 100644 core/embed/models/T3W1/memory.ld create mode 100644 core/embed/models/T3W1/model_T3W1.h create mode 100644 core/embed/models/T3W1/vendorheader/vendor_dev_DO_NOT_SIGN.json create mode 100644 core/embed/models/T3W1/vendorheader/vendor_dev_DO_NOT_SIGN.toif create mode 100644 core/embed/models/T3W1/vendorheader/vendorheader_dev_DO_NOT_SIGN_signed_dev.bin create mode 100644 core/embed/models/T3W1/vendorheader/vendorheader_dev_DO_NOT_SIGN_unsigned.bin create mode 100644 core/embed/models/T3W1/versions.h create mode 100644 core/site_scons/models/T3W1/__init__.py create mode 100644 core/site_scons/models/T3W1/trezor_t3w1_d1.py diff --git a/core/Makefile b/core/Makefile index c63a07a93f..1755fd6745 100644 --- a/core/Makefile +++ b/core/Makefile @@ -62,6 +62,10 @@ else ifeq ($(TREZOR_MODEL),$(filter $(TREZOR_MODEL),T3B1)) MCU = STM32U5 OPENOCD_TARGET = target/stm32u5x.cfg MODEL_FEATURE = model_tr +else ifeq ($(TREZOR_MODEL),$(filter $(TREZOR_MODEL),T3W1)) +MCU = STM32F4 +OPENOCD_TARGET = target/stm32f4x.cfg +MODEL_FEATURE = model_tt else ifeq ($(TREZOR_MODEL),$(filter $(TREZOR_MODEL),DISC1)) MCU = STM32F4 OPENOCD_TARGET = target/stm32f4x.cfg diff --git a/core/embed/models/T3W1/boards/trezor_t3w1_d1.h b/core/embed/models/T3W1/boards/trezor_t3w1_d1.h new file mode 100644 index 0000000000..6bfc122b75 --- /dev/null +++ b/core/embed/models/T3W1/boards/trezor_t3w1_d1.h @@ -0,0 +1,82 @@ +#ifndef _TREZOR_T3W1_H +#define _TREZOR_T3W1_H + +#define HSE_8MHZ + +#define USE_SD_CARD 1 +#define USE_I2C 1 +#define USE_TOUCH 1 +// #define USE_BUTTON 1 +#define USE_SBU 1 +#define USE_RGB_COLORS 1 +#define USE_BACKLIGHT 1 +#define USE_DISP_I8080_16BIT_DW 1 +// #define USE_BLE 1 + +#define DISPLAY_RESX 240 +#define DISPLAY_RESY 320 +#define DISPLAY_COLOR_MODE DMA2D_OUTPUT_RGB565 +#define DISPLAY_LEGACY_HEADER "displays/st7789v.h" +#define DISPLAY_PANEL_LHS200KB_IF21 1 + +// #define DISPLAY_PANEL_INIT_SEQ lhs200kb_if21_init_seq +// #define DISPLAY_PANEL_ROTATE lhs200kb_if21_rotate +// #define TRANSFORM_TOUCH_COORDS lhs200kb_if21_transform_touch_coords + +#define BACKLIGHT_PWM_FREQ 50000 +#define BACKLIGHT_PWM_TIM TIM1 +#define BACKLIGHT_PWM_TIM_CLK_EN __HAL_RCC_TIM1_CLK_ENABLE +#define BACKLIGHT_PWM_TIM_AF GPIO_AF1_TIM1 +#define BACKLIGHT_PWM_TIM_OCMODE TIM_OCMODE_PWM2 +#define BACKLIGHT_PWM_TIM_CHANNEL TIM_CHANNEL_1 +#define BACKLIGHT_PWM_TIM_CCR CCR1 +#define BACKLIGHT_PWM_PIN GPIO_PIN_7 +#define BACKLIGHT_PWM_PORT GPIOA +#define BACKLIGHT_PWM_PORT_CLK_EN __HAL_RCC_GPIOA_CLK_ENABLE + +#define I2C_COUNT 1 +#define I2C_INSTANCE_0 I2C2 +#define I2C_INSTANCE_0_CLK_EN __HAL_RCC_I2C2_CLK_ENABLE +#define I2C_INSTANCE_0_CLK_DIS __HAL_RCC_I2C2_CLK_DISABLE +#define I2C_INSTANCE_0_PIN_AF GPIO_AF4_I2C2 +#define I2C_INSTANCE_0_SDA_PORT GPIOB +#define I2C_INSTANCE_0_SDA_PIN GPIO_PIN_11 +#define I2C_INSTANCE_0_SDA_CLK_EN __HAL_RCC_GPIOB_CLK_ENABLE +#define I2C_INSTANCE_0_SCL_PORT GPIOB +#define I2C_INSTANCE_0_SCL_PIN GPIO_PIN_10 +#define I2C_INSTANCE_0_SCL_CLK_EN __HAL_RCC_GPIOB_CLK_ENABLE +#define I2C_INSTANCE_0_RESET_REG &RCC->APB1RSTR +#define I2C_INSTANCE_0_RESET_BIT RCC_APB1RSTR_I2C2RST +#define I2C_INSTANCE_0_EV_IRQHandler I2C2_EV_IRQHandler +#define I2C_INSTANCE_0_ER_IRQHandler I2C2_ER_IRQHandler +#define I2C_INSTANCE_0_EV_IRQn I2C2_EV_IRQn +#define I2C_INSTANCE_0_ER_IRQn I2C2_ER_IRQn +#define I2C_INSTANCE_0_GUARD_TIME 0 + +#define TOUCH_PANEL_LHS200KB_IF21 1 +#define TOUCH_SENSITIVITY 0x06 +#define TOUCH_I2C_INSTANCE 0 +#define TOUCH_RST_PORT GPIOC +#define TOUCH_RST_PIN GPIO_PIN_5 +#define TOUCH_INT_PORT GPIOC +#define TOUCH_INT_PIN GPIO_PIN_4 +#define TOUCH_ON_PORT GPIOB +#define TOUCH_ON_PIN GPIO_PIN_8 + +#define SD_DETECT_PORT GPIOB +#define SD_DETECT_PIN GPIO_PIN_0 +#define SD_ENABLE_PORT GPIOE +#define SD_ENABLE_PIN GPIO_PIN_1 + +#define GPIO_1_PORT GPIOC +#define GPIO_1_PIN GPIO_PIN_1 +#define GPIO_2_PORT GPIOC +#define GPIO_2_PIN GPIO_PIN_6 +#define GPIO_3_PORT GPIOC +#define GPIO_3_PIN GPIO_PIN_7 + +#define BTN_POWER_CLK_ENA __HAL_RCC_GPIOE_CLK_ENABLE +#define BTN_POWER_PORT GPIOE +#define BTN_POWER_PIN GPIO_PIN_0 + +#endif //_TREZOR_T3W1_H diff --git a/core/embed/models/T3W1/bootloaders/bootloader_T3W1.bin b/core/embed/models/T3W1/bootloaders/bootloader_T3W1.bin new file mode 100755 index 0000000000000000000000000000000000000000..bdd76d2be34319ebc6241c7ff52077dcb3bc7c17 GIT binary patch literal 118784 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

@l5;g_Wk>TTpU^z|_%DZliyQsv2kY*=Ykk;r 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 literal 0 HcmV?d00001 diff --git a/core/embed/models/T3W1/bootloaders/bootloader_hashes.h b/core/embed/models/T3W1/bootloaders/bootloader_hashes.h new file mode 100644 index 0000000000..cd1a08b71e --- /dev/null +++ b/core/embed/models/T3W1/bootloaders/bootloader_hashes.h @@ -0,0 +1,13 @@ +#ifndef BOOTLOADER_HASHES_H +#define BOOTLOADER_HASHES_H + +// Auto-generated file, do not edit. + +// clang-format off +// bootloader_T3W1.bin version 2.1.10.0 +#define BOOTLOADER_T3W1_00 {0xc9, 0x2b, 0x45, 0xf2, 0x8d, 0x97, 0x1d, 0xf2, 0x42, 0xf3, 0x2e, 0xd4, 0x14, 0xb9, 0x70, 0x8e, 0x15, 0x38, 0xeb, 0xc0, 0x32, 0x35, 0x6b, 0xb8, 0x29, 0x2c, 0xe9, 0x56, 0x54, 0xad, 0xc5, 0xb2} +#define BOOTLOADER_T3W1_FF {0xd6, 0x8d, 0x69, 0xa7, 0xcf, 0x73, 0xe1, 0xf7, 0xdc, 0xa2, 0x65, 0x51, 0x1b, 0x4e, 0x67, 0x4c, 0x57, 0x76, 0x35, 0x31, 0x38, 0xc5, 0x40, 0x39, 0x9f, 0x3c, 0xf8, 0x97, 0x3b, 0xa0, 0xa7, 0x24} + +// clang-format on + +#endif diff --git a/core/embed/models/T3W1/memory.ld b/core/embed/models/T3W1/memory.ld new file mode 100644 index 0000000000..8c5a1eaec3 --- /dev/null +++ b/core/embed/models/T3W1/memory.ld @@ -0,0 +1,52 @@ +/* Auto-generated file, do not edit.*/ + +NORCOW_SECTOR_SIZE = 0x10000; +FLASH_START = 0x8000000; +BOARDLOADER_START = 0x8000000; +BOARDLOADER_MAXSIZE = 0xc000; +BOARDLOADER_SECTOR_START = 0x0; +BOARDLOADER_SECTOR_END = 0x2; +BOARDCAPS_START = 0x800bf00; +BOARDCAPS_MAXSIZE = 0x100; +UNUSED_1_START = 0x800c000; +UNUSED_1_MAXSIZE = 0x4000; +UNUSED_1_SECTOR_START = 0x3; +UNUSED_1_SECTOR_END = 0x3; +STORAGE_1_START = 0x8010000; +STORAGE_1_MAXSIZE = 0x10000; +STORAGE_1_SECTOR_START = 0x4; +STORAGE_1_SECTOR_END = 0x4; +BOOTLOADER_START = 0x8020000; +BOOTLOADER_MAXSIZE = 0x20000; +BOOTLOADER_SECTOR_START = 0x5; +BOOTLOADER_SECTOR_END = 0x5; +FIRMWARE_START = 0x8040000; +FIRMWARE_MAXSIZE = 0x1a0000; +FIRMWARE_P1_START = 0x8040000; +FIRMWARE_P1_MAXSIZE = 0xc0000; +FIRMWARE_P1_SECTOR_START = 0x6; +FIRMWARE_P1_SECTOR_END = 0xb; +KERNEL_START = 0x8040000; +KERNEL_MAXSIZE = 0x80000; +ASSETS_START = 0x8100000; +ASSETS_MAXSIZE = 0xc000; +ASSETS_SECTOR_START = 0xc; +ASSETS_SECTOR_END = 0xe; +UNUSED_2_START = 0x810c000; +UNUSED_2_MAXSIZE = 0x4000; +UNUSED_2_SECTOR_START = 0xf; +UNUSED_2_SECTOR_END = 0xf; +STORAGE_2_START = 0x8110000; +STORAGE_2_MAXSIZE = 0x10000; +STORAGE_2_SECTOR_START = 0x10; +STORAGE_2_SECTOR_END = 0x10; +FIRMWARE_P2_START = 0x8120000; +FIRMWARE_P2_MAXSIZE = 0xe0000; +FIRMWARE_P2_SECTOR_START = 0x11; +FIRMWARE_P2_SECTOR_END = 0x17; +KERNEL_STACK_SIZE = 0x2000; +KERNEL_CCMRAM_SIZE = 0x4000; +KERNEL_FRAMEBUFFER_SIZE = 0x0; +KERNEL_SRAM_SIZE = 0x400; +BOOTARGS_SIZE = 0x100; +CODE_ALIGNMENT = 0x200; diff --git a/core/embed/models/T3W1/model_T3W1.h b/core/embed/models/T3W1/model_T3W1.h new file mode 100644 index 0000000000..dcae9a33be --- /dev/null +++ b/core/embed/models/T3W1/model_T3W1.h @@ -0,0 +1,99 @@ +#ifndef MODELS_MODEL_T3W1_H_ +#define MODELS_MODEL_T3W1_H_ + +// #include "bootloaders/bootloader_hashes.h" + +#include "sizedefs.h" + +#define MODEL_NAME "T3W1" +#define MODEL_FULL_NAME "Trezor T3W1" +#define MODEL_INTERNAL_NAME "T3W1" +#define MODEL_INTERNAL_NAME_TOKEN T3W1 +#define MODEL_INTERNAL_NAME_QSTR MP_QSTR_T3W1 +#define MODEL_USB_MANUFACTURER "Trezor Company" +#define MODEL_USB_PRODUCT MODEL_FULL_NAME + +// todo replace dev keys with produciton ones +#define MODEL_BOARDLOADER_KEYS \ + (const uint8_t *)"\xdb\x99\x5f\xe2\x51\x69\xd1\x41\xca\xb9\xbb\xba\x92\xba\xa0\x1f\x9f\x2e\x1e\xce\x7d\xf4\xcb\x2a\xc0\x51\x90\xf3\x7f\xcc\x1f\x9d", \ +(const uint8_t *)"\x21\x52\xf8\xd1\x9b\x79\x1d\x24\x45\x32\x42\xe1\x5f\x2e\xab\x6c\xb7\xcf\xfa\x7b\x6a\x5e\xd3\x00\x97\x96\x0e\x06\x98\x81\xdb\x12", \ +(const uint8_t *)"\x22\xfc\x29\x77\x92\xf0\xb6\xff\xc0\xbf\xcf\xdb\x7e\xdb\x0c\x0a\xa1\x4e\x02\x5a\x36\x5e\xc0\xe3\x42\xe8\x6e\x38\x29\xcb\x74\xb6", + +#define MODEL_BOOTLOADER_KEYS \ + (const uint8_t *)"\xd7\x59\x79\x3b\xbc\x13\xa2\x81\x9a\x82\x7c\x76\xad\xb6\xfb\xa8\xa4\x9a\xee\x00\x7f\x49\xf2\xd0\x99\x2d\x99\xb8\x25\xad\x2c\x48", \ +(const uint8_t *)"\x63\x55\x69\x1c\x17\x8a\x8f\xf9\x10\x07\xa7\x47\x8a\xfb\x95\x5e\xf7\x35\x2c\x63\xe7\xb2\x57\x03\x98\x4c\xf7\x8b\x26\xe2\x1a\x56", \ +(const uint8_t *)"\xee\x93\xa4\xf6\x6f\x8d\x16\xb8\x19\xbb\x9b\xeb\x9f\xfc\xcd\xfc\xdc\x14\x12\xe8\x7f\xee\x6a\x32\x4c\x2a\x99\xa1\xe0\xe6\x71\x48", + +#define IMAGE_CHUNK_SIZE (128 * 1024) +#define IMAGE_HASH_BLAKE2S +#define DISPLAY_JUMP_BEHAVIOR DISPLAY_RESET_CONTENT + +// SHARED WITH MAKEFILE +// common + +#define NORCOW_SECTOR_SIZE (1 * 64 * 1024) // 64 kB +#define FLASH_START 0x08000000 + +// FLASH layout +#define BOARDLOADER_START 0x08000000 +#define BOARDLOADER_MAXSIZE (3 * 16 * 1024) // 48 kB +#define BOARDLOADER_SECTOR_START 0 +#define BOARDLOADER_SECTOR_END 2 + +#define BOARDCAPS_START 0x0800BF00 +#define BOARDCAPS_MAXSIZE 0x100 + +#define UNUSED_1_START 0x0800C000 +#define UNUSED_1_MAXSIZE (1 * 16 * 1024) // 16 kB +#define UNUSED_1_SECTOR_START 3 +#define UNUSED_1_SECTOR_END 3 + +#define STORAGE_1_START 0x08010000 +#define STORAGE_1_MAXSIZE (1 * 64 * 1024) // 64 kB +#define STORAGE_1_SECTOR_START 4 +#define STORAGE_1_SECTOR_END 4 + +#define BOOTLOADER_START 0x08020000 +#define BOOTLOADER_MAXSIZE (1 * 128 * 1024) // 128 kB +#define BOOTLOADER_SECTOR_START 5 +#define BOOTLOADER_SECTOR_END 5 + +#define FIRMWARE_START 0x08040000 +#define FIRMWARE_MAXSIZE (13 * 128 * 1024) // 1664 kB +#define FIRMWARE_P1_START 0x08040000 +#define FIRMWARE_P1_MAXSIZE (6 * 128 * 1024) +#define FIRMWARE_P1_SECTOR_START 6 +#define FIRMWARE_P1_SECTOR_END 11 +// part of firmware P1 +#define KERNEL_START 0x08040000 +#define KERNEL_MAXSIZE (4 * 128 * 1024) + +#define ASSETS_START 0x08100000 +#define ASSETS_MAXSIZE (3 * 16 * 1024) // 48 kB +#define ASSETS_SECTOR_START 12 +#define ASSETS_SECTOR_END 14 + +#define UNUSED_2_START 0x0810C000 +#define UNUSED_2_MAXSIZE (1 * 16 * 1024) // 16 kB +#define UNUSED_2_SECTOR_START 15 +#define UNUSED_2_SECTOR_END 15 + +#define STORAGE_2_START 0x08110000 +#define STORAGE_2_MAXSIZE (1 * 64 * 1024) // 64 kB +#define STORAGE_2_SECTOR_START 16 +#define STORAGE_2_SECTOR_END 16 + +#define FIRMWARE_P2_START 0x08120000 +#define FIRMWARE_P2_MAXSIZE (7 * 128 * 1024) +#define FIRMWARE_P2_SECTOR_START 17 +#define FIRMWARE_P2_SECTOR_END 23 + +// RAM layout +#define KERNEL_STACK_SIZE 8 * 1024 +#define KERNEL_CCMRAM_SIZE 16 * 1024 +#define KERNEL_FRAMEBUFFER_SIZE 0 * 1024 +#define KERNEL_SRAM_SIZE 1 * 1024 + +#define BOOTARGS_SIZE 0x100 +#define CODE_ALIGNMENT 0x200 +#endif diff --git a/core/embed/models/T3W1/vendorheader/vendor_dev_DO_NOT_SIGN.json b/core/embed/models/T3W1/vendorheader/vendor_dev_DO_NOT_SIGN.json new file mode 100644 index 0000000000..c88c58a88b --- /dev/null +++ b/core/embed/models/T3W1/vendorheader/vendor_dev_DO_NOT_SIGN.json @@ -0,0 +1,20 @@ +{ + "header_len": 1024, + "text": "DEV ONLY, DO NOT USE!", + "hw_model": "T3W1", + "expiry": 0, + "version": [0, 0], + "sig_m": 2, + "trust": { + "allow_run_with_secret": true, + "show_vendor_string": false, + "require_user_click": false, + "red_background": false, + "delay": 0 + }, + "pubkeys": [ + "e28a8970753332bd72fef413e6b0b2ef1b4aadda7aa2c141f233712a6876b351", + "d4eec1869fb1b8a4e817516ad5a931557cb56805c3eb16e8f3a803d647df7869", + "772c8a442b7db06e166cfbc1ccbcbcde6f3eba76a4e98ef3ffc519502237d6ef" + ] +} diff --git a/core/embed/models/T3W1/vendorheader/vendor_dev_DO_NOT_SIGN.toif b/core/embed/models/T3W1/vendorheader/vendor_dev_DO_NOT_SIGN.toif new file mode 100644 index 0000000000000000000000000000000000000000..24b655daec76d5873fd07c108a8ef894ac460890 GIT binary patch literal 791 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 literal 0 HcmV?d00001 diff --git a/core/embed/models/T3W1/versions.h b/core/embed/models/T3W1/versions.h new file mode 100644 index 0000000000..42408b3df8 --- /dev/null +++ b/core/embed/models/T3W1/versions.h @@ -0,0 +1,3 @@ + +#define BOOTLOADER_MONOTONIC_VERSION 1 +#define FIRMWARE_MONOTONIC_VERSION 1 diff --git a/core/embed/models/model.h b/core/embed/models/model.h index 03c6b34a2b..f178a0bb7c 100644 --- a/core/embed/models/model.h +++ b/core/embed/models/model.h @@ -12,6 +12,8 @@ #include "T3T1/model_T3T1.h" #elif defined TREZOR_MODEL_T3B1 #include "T3B1/model_T3B1.h" +#elif defined TREZOR_MODEL_T3W1 +#include "T3W1/model_T3W1.h" #elif defined TREZOR_MODEL_DISC1 #include "D001/model_D001.h" #elif defined TREZOR_MODEL_DISC2 diff --git a/core/embed/models/model_version.h b/core/embed/models/model_version.h index 819826ba72..25c1552a0a 100644 --- a/core/embed/models/model_version.h +++ b/core/embed/models/model_version.h @@ -9,6 +9,8 @@ #include "T3T1/versions.h" #elif defined TREZOR_MODEL_T3B1 #include "T3B1/versions.h" +#elif defined TREZOR_MODEL_T3W1 +#include "T3W1/versions.h" #elif defined TREZOR_MODEL_DISC1 #include "D001/versions.h" #elif defined TREZOR_MODEL_DISC2 diff --git a/core/site_scons/models/T3W1/__init__.py b/core/site_scons/models/T3W1/__init__.py new file mode 100644 index 0000000000..6874ed2f0e --- /dev/null +++ b/core/site_scons/models/T3W1/__init__.py @@ -0,0 +1,37 @@ +from __future__ import annotations + +from typing import Optional + +from . import trezor_t3w1_d1 + + +def configure_board( + revision: Optional[int | str], + features_wanted: list[str], + env: dict, # type: ignore + defines: list[str | tuple[str, str]], + sources: list[str], + paths: list[str], +): + # Set default revision if None + revision = revision or "d1" + + # Mapping of revisions to their respective configurations + revision_map = { + "d1": trezor_t3w1_d1, + } + + module = revision_map.get(revision) + + if module: + return module.configure(env, features_wanted, defines, sources, paths) + + raise Exception("Unknown model_r_version") + + +def get_model_ui() -> str: + return "tt" + + +def get_model_ui_conf() -> list[str]: + return [] diff --git a/core/site_scons/models/T3W1/trezor_t3w1_d1.py b/core/site_scons/models/T3W1/trezor_t3w1_d1.py new file mode 100644 index 0000000000..a371e3e989 --- /dev/null +++ b/core/site_scons/models/T3W1/trezor_t3w1_d1.py @@ -0,0 +1,109 @@ +from __future__ import annotations + +from .. import get_hw_model_as_number +from ..stm32f4_common import stm32f4_common_files + + +def configure( + env: dict, + features_wanted: list[str], + defines: list[str | tuple[str, str]], + sources: list[str], + paths: list[str], +) -> list[str]: + features_available: list[str] = [] + board = "T3W1/boards/trezor_t3w1_d1.h" + hw_model = get_hw_model_as_number("T3W1") + hw_revision = 0 + features_available.append("disp_i8080_16bit_dw") + + defines += ["DISPLAY_RGB565"] + features_available.append("display_rgb565") + + mcu = "STM32F427xx" + + stm32f4_common_files(env, defines, sources, paths) + + env.get("ENV")[ + "CPU_ASFLAGS" + ] = "-mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16" + env.get("ENV")[ + "CPU_CCFLAGS" + ] = "-mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mtune=cortex-m4 " + env.get("ENV")["RUST_TARGET"] = "thumbv7em-none-eabihf" + + defines += [mcu] + defines += [f'TREZOR_BOARD=\\"{board}\\"'] + defines += [f"HW_MODEL={hw_model}"] + defines += [f"HW_REVISION={hw_revision}"] + + sources += ["embed/trezorhal/xdisplay_legacy.c"] + sources += ["embed/trezorhal/stm32f4/xdisplay/st-7789/display_nofb.c"] + sources += ["embed/trezorhal/stm32f4/xdisplay/st-7789/display_driver.c"] + sources += ["embed/trezorhal/stm32f4/xdisplay/st-7789/display_io.c"] + sources += ["embed/trezorhal/stm32f4/xdisplay/st-7789/display_panel.c"] + sources += [ + "embed/trezorhal/stm32f4/xdisplay/st-7789/panels/lhs200kb-if21.c", + ] + + sources += ["embed/trezorhal/stm32f4/backlight_pwm.c"] + + features_available.append("backlight") + + if "input" in features_wanted: + sources += ["embed/trezorhal/stm32f4/i2c_bus.c"] + sources += ["embed/trezorhal/stm32f4/touch/ft6x36.c"] + sources += ["embed/trezorhal/stm32f4/touch/panels/lhs200kb-if21.c"] + features_available.append("touch") + # sources += ["embed/trezorhal/stm32f4/button.c"] + # features_available.append("button") + + if "sd_card" in features_wanted: + sources += ["embed/trezorhal/stm32f4/sdcard.c"] + sources += ["embed/extmod/modtrezorio/ff.c"] + sources += ["embed/extmod/modtrezorio/ffunicode.c"] + features_available.append("sd_card") + + # if "ble" in features_wanted: + # sources += ["embed/trezorhal/stm32f4/ble/ble_hal.c"] + # sources += ["embed/trezorhal/stm32f4/ble/dfu.c"] + # sources += ["embed/trezorhal/stm32f4/ble/fwu.c"] + # sources += ["embed/trezorhal/stm32f4/ble/ble.c"] + # sources += ["embed/trezorhal/stm32f4/ble/messages.c"] + # sources += [ + # "vendor/micropython/lib/stm32lib/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c" + # ] + # features_available.append("ble") + + if "ble" in features_wanted or "sd_card" in features_wanted: + sources += [ + "vendor/micropython/lib/stm32lib/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c" + ] + + if "sbu" in features_wanted: + sources += ["embed/trezorhal/stm32f4/sbu.c"] + features_available.append("sbu") + + if "usb" in features_wanted: + sources += [ + "embed/trezorhal/stm32f4/usb/usb_class_hid.c", + "embed/trezorhal/stm32f4/usb/usb_class_vcp.c", + "embed/trezorhal/stm32f4/usb/usb_class_webusb.c", + "embed/trezorhal/stm32f4/usb/usb.c", + "embed/trezorhal/stm32f4/usb/usbd_conf.c", + "embed/trezorhal/stm32f4/usb/usbd_core.c", + "embed/trezorhal/stm32f4/usb/usbd_ctlreq.c", + "embed/trezorhal/stm32f4/usb/usbd_ioreq.c", + "vendor/micropython/lib/stm32lib/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c", + ] + features_available.append("usb") + + if "dma2d" in features_wanted: + defines += ["USE_DMA2D"] + sources += ["embed/trezorhal/stm32u5/dma2d_bitblt.c"] + sources += [ + "vendor/micropython/lib/stm32lib/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c", + ] + features_available.append("dma2d") + + return features_available diff --git a/python/src/trezorlib/firmware/models.py b/python/src/trezorlib/firmware/models.py index 3d859328b8..dfcc9cd4ea 100644 --- a/python/src/trezorlib/firmware/models.py +++ b/python/src/trezorlib/firmware/models.py @@ -29,10 +29,11 @@ if t.TYPE_CHECKING: class Model(Enum): T1B1 = b"T1B1" - T2T1 = b"T2T1" - T3T1 = b"T3T1" - T3B1 = b"T3B1" T2B1 = b"T2B1" + T2T1 = b"T2T1" + T3B1 = b"T3B1" + T3T1 = b"T3T1" + T3W1 = b"T3W1" D001 = b"D001" D002 = b"D002" @@ -298,6 +299,12 @@ T3B1_HASH_PARAMS = FirmwareHashParameters( padding_byte=None, ) +T3W1_HASH_PARAMS = FirmwareHashParameters( + hash_function=hashlib.blake2s, + chunk_size=1024 * 128, + padding_byte=None, +) + D002_HASH_PARAMS = FirmwareHashParameters( hash_function=hashlib.sha256, chunk_size=1024 * 256, @@ -310,6 +317,7 @@ MODEL_MAP = { Model.T2B1: T2B1, Model.T3T1: T3T1, Model.T3B1: T3B1, + Model.T3W1: TREZOR_CORE_DEV, Model.D001: TREZOR_CORE_DEV, Model.D002: TREZOR_CORE_DEV, } @@ -320,6 +328,7 @@ MODEL_MAP_DEV = { Model.T2B1: TREZOR_CORE_DEV, Model.T3T1: TREZOR_CORE_DEV, Model.T3B1: TREZOR_CORE_DEV, + Model.T3W1: TREZOR_CORE_DEV, Model.D001: TREZOR_CORE_DEV, Model.D002: TREZOR_CORE_DEV, } @@ -330,6 +339,7 @@ MODEL_HASH_PARAMS_MAP = { Model.T2B1: T2T1_HASH_PARAMS, Model.T3T1: T3T1_HASH_PARAMS, Model.T3B1: T3B1_HASH_PARAMS, + Model.T3W1: T3W1_HASH_PARAMS, Model.D001: T2T1_HASH_PARAMS, Model.D002: D002_HASH_PARAMS, } @@ -341,6 +351,7 @@ MODEL_CODE_ALIGNMENT_MAP = { Model.T2B1: 0x200, Model.T3T1: 0x200, Model.T3B1: 0x200, + Model.T3W1: 0x200, Model.D001: 0x200, Model.D002: 0x400, } diff --git a/python/src/trezorlib/models.py b/python/src/trezorlib/models.py index b1d638a6fd..4c430980da 100644 --- a/python/src/trezorlib/models.py +++ b/python/src/trezorlib/models.py @@ -81,6 +81,15 @@ T3B1 = TrezorModel( default_mapping=mapping.DEFAULT_MAPPING, ) +T3W1 = TrezorModel( + name="T3W1", + internal_name="T3W1", + minimum_version=(2, 1, 0), + vendors=VENDORS, + usb_ids=((0x1209, 0x53C1), (0x1209, 0x53C0)), + default_mapping=mapping.DEFAULT_MAPPING, +) + DISC1 = TrezorModel( name="DISC1", internal_name="D001", @@ -109,7 +118,7 @@ TREZOR_SAFE5 = T3T1 TREZOR_DISC1 = DISC1 TREZOR_DISC2 = DISC2 -TREZORS = frozenset({T1B1, T2T1, T2B1, T3T1, T3B1, DISC1, DISC2}) +TREZORS = frozenset({T1B1, T2T1, T2B1, T3T1, T3B1, T3W1, DISC1, DISC2}) def by_name(name: Optional[str]) -> Optional[TrezorModel]: