diff --git a/core/Makefile b/core/Makefile index fc48c5fa59..a16a43872f 100644 --- a/core/Makefile +++ b/core/Makefile @@ -38,7 +38,6 @@ ADDRESS_SANITIZER ?= 0 CMAKELISTS ?= 0 PYTEST_TIMEOUT ?= 500 TEST_LANG ?= "en" -NEW_RENDERING ?= 1 THP ?= 0 BENCHMARK ?= 0 @@ -253,12 +252,12 @@ build_embed: build_boardloader build_bootloader build_firmware # build boardload build_boardloader: ## build boardloader $(SCONS) CFLAGS="$(CFLAGS)" PRODUCTION="$(PRODUCTION)" TREZOR_MODEL="$(TREZOR_MODEL)" \ - CMAKELISTS="$(CMAKELISTS)" NEW_RENDERING="$(NEW_RENDERING)" $(BOARDLOADER_BUILD_DIR)/boardloader.bin + CMAKELISTS="$(CMAKELISTS)" $(BOARDLOADER_BUILD_DIR)/boardloader.bin build_bootloader: ## build bootloader $(SCONS) CFLAGS="$(CFLAGS)" PRODUCTION="$(PRODUCTION)" TREZOR_MODEL="$(TREZOR_MODEL)" \ CMAKELISTS="$(CMAKELISTS)" BOOTLOADER_QA="$(BOOTLOADER_QA)" BOOTLOADER_DEVEL="$(BOOTLOADER_DEVEL)" \ - NEW_RENDERING="$(NEW_RENDERING)" $(BOOTLOADER_BUILD_DIR)/bootloader.bin + $(BOOTLOADER_BUILD_DIR)/bootloader.bin build_bootloader_ci: ## build CI device testing bootloader $(SCONS) CFLAGS="$(CFLAGS)" PRODUCTION="$(PRODUCTION)" TREZOR_MODEL="$(TREZOR_MODEL)" \ @@ -266,11 +265,11 @@ build_bootloader_ci: ## build CI device testing bootloader build_bootloader_emu: ## build the unix bootloader emulator $(SCONS) CFLAGS="$(CFLAGS)" PRODUCTION="$(PRODUCTION)" TREZOR_MODEL="$(TREZOR_MODEL)" \ - CMAKELISTS="$(CMAKELISTS)" NEW_RENDERING="$(NEW_RENDERING)" $(BOOTLOADER_EMU_BUILD_DIR)/bootloader.elf + CMAKELISTS="$(CMAKELISTS)" $(BOOTLOADER_EMU_BUILD_DIR)/bootloader.elf build_bootloader_emu_debug: ## build the unix bootloader emulator $(SCONS) CFLAGS="$(CFLAGS)" PRODUCTION="$(PRODUCTION)" TREZOR_MODEL="$(TREZOR_MODEL)" \ - CMAKELISTS="$(CMAKELISTS)" NEW_RENDERING="$(NEW_RENDERING)" TREZOR_EMULATOR_DEBUGGABLE=1 \ + CMAKELISTS="$(CMAKELISTS)" TREZOR_EMULATOR_DEBUGGABLE=1 \ $(BOOTLOADER_EMU_BUILD_DIR)/bootloader.elf build_prodtest: ## build production test firmware @@ -279,7 +278,7 @@ build_prodtest: ## build production test firmware build_reflash: ## build reflash firmware + reflash image $(SCONS) CFLAGS="$(CFLAGS)" PRODUCTION="$(PRODUCTION)" TREZOR_MODEL="$(TREZOR_MODEL)" \ - CMAKELISTS="$(CMAKELISTS)" NEW_RENDERING="$(NEW_RENDERING)" $(REFLASH_BUILD_DIR)/reflash.bin + CMAKELISTS="$(CMAKELISTS)" $(REFLASH_BUILD_DIR)/reflash.bin dd if=build/boardloader/boardloader.bin of=$(REFLASH_BUILD_DIR)/sdimage.bin bs=1 seek=0 dd if=build/bootloader/bootloader.bin of=$(REFLASH_BUILD_DIR)/sdimage.bin bs=1 seek=49152 @@ -294,27 +293,27 @@ build_firmware: templates build_cross build_kernel ## build firmware with frozen TREZOR_MODEL="$(TREZOR_MODEL)" CMAKELISTS="$(CMAKELISTS)" \ PYOPT="$(PYOPT)" BITCOIN_ONLY="$(BITCOIN_ONLY)" \ BOOTLOADER_QA="$(BOOTLOADER_QA)" BOOTLOADER_DEVEL="$(BOOTLOADER_DEVEL)" \ - DISABLE_OPTIGA="$(DISABLE_OPTIGA)" THP="$(THP)" NEW_RENDERING="$(NEW_RENDERING)" \ + DISABLE_OPTIGA="$(DISABLE_OPTIGA)" THP="$(THP)" \ BENCHMARK="$(BENCHMARK)" $(FIRMWARE_BUILD_DIR)/firmware.bin build_unix: templates ## build unix port $(SCONS) CFLAGS="$(CFLAGS)" $(UNIX_BUILD_DIR)/trezor-emu-core $(UNIX_PORT_OPTS) \ TREZOR_MODEL="$(TREZOR_MODEL)" CMAKELISTS="$(CMAKELISTS)" THP="$(THP)" \ PYOPT="0" BITCOIN_ONLY="$(BITCOIN_ONLY)" TREZOR_EMULATOR_ASAN="$(ADDRESS_SANITIZER)" \ - NEW_RENDERING="$(NEW_RENDERING)" BENCHMARK="$(BENCHMARK)" + BENCHMARK="$(BENCHMARK)" build_unix_frozen: templates build_cross ## build unix port with frozen modules $(SCONS) CFLAGS="$(CFLAGS)" $(UNIX_BUILD_DIR)/trezor-emu-core $(UNIX_PORT_OPTS) \ TREZOR_MODEL="$(TREZOR_MODEL)" CMAKELISTS="$(CMAKELISTS)" \ PYOPT="$(PYOPT)" BITCOIN_ONLY="$(BITCOIN_ONLY)" TREZOR_EMULATOR_ASAN="$(ADDRESS_SANITIZER)" \ - TREZOR_MEMPERF="$(TREZOR_MEMPERF)" TREZOR_EMULATOR_FROZEN=1 NEW_RENDERING="$(NEW_RENDERING)" \ + TREZOR_MEMPERF="$(TREZOR_MEMPERF)" TREZOR_EMULATOR_FROZEN=1 \ BENCHMARK="$(BENCHMARK)" build_unix_debug: templates ## build unix port $(SCONS) --max-drift=1 CFLAGS="$(CFLAGS)" $(UNIX_BUILD_DIR)/trezor-emu-core $(UNIX_PORT_OPTS) \ TREZOR_MODEL="$(TREZOR_MODEL)" CMAKELISTS="$(CMAKELISTS)" \ BITCOIN_ONLY="$(BITCOIN_ONLY)" TREZOR_EMULATOR_ASAN=1 TREZOR_EMULATOR_DEBUGGABLE=1 \ - NEW_RENDERING="$(NEW_RENDERING)" BENCHMARK="$(BENCHMARK)" + BENCHMARK="$(BENCHMARK)" build_cross: ## build mpy-cross port $(MAKE) -C vendor/micropython/mpy-cross $(CROSS_PORT_OPTS) diff --git a/core/SConscript.boardloader b/core/SConscript.boardloader index 3e2511f47b..c267b47cde 100644 --- a/core/SConscript.boardloader +++ b/core/SConscript.boardloader @@ -6,14 +6,10 @@ import tools, models TREZOR_MODEL = ARGUMENTS.get('TREZOR_MODEL', 'T') CMAKELISTS = int(ARGUMENTS.get('CMAKELISTS', 0)) HW_REVISION = ARGUMENTS.get('HW_REVISION', None) -NEW_RENDERING = ARGUMENTS.get('NEW_RENDERING', '1') == '1' MODEL_IDENTIFIER = models.get_model_identifier(TREZOR_MODEL) FEATURES_WANTED = ["sd_card"] -if NEW_RENDERING: - FEATURES_WANTED.append("new_rendering") - CCFLAGS_MOD = '' CPPPATH_MOD = [] CPPDEFINES_MOD = ["BOARDLOADER"] @@ -56,7 +52,6 @@ CPPPATH_MOD += [ 'vendor/micropython/lib/uzlib', ] SOURCE_MOD += [ - 'embed/lib/colors.c', 'embed/lib/display_utils.c', 'embed/lib/error_handling.c', 'embed/lib/flash_utils.c', @@ -70,18 +65,8 @@ SOURCE_MOD += [ 'embed/lib/mini_printf.c', 'embed/lib/rsod.c', 'embed/lib/terminal.c', + 'embed/lib/gfx_draw.c' ] -if NEW_RENDERING: - CPPDEFINES_MOD += ['NEW_RENDERING'] - SOURCE_MOD += [ - 'embed/lib/gfx_draw.c', - ] -else: - SOURCE_MOD += [ - 'embed/lib/display_draw.c', - ] - - env = Environment(ENV=os.environ, CFLAGS='%s -DPRODUCTION=%s' % (ARGUMENTS.get('CFLAGS', ''), ARGUMENTS.get('PRODUCTION', '0')), diff --git a/core/SConscript.bootloader b/core/SConscript.bootloader index 70cca73006..82b3cdbd85 100644 --- a/core/SConscript.bootloader +++ b/core/SConscript.bootloader @@ -8,14 +8,10 @@ CMAKELISTS = int(ARGUMENTS.get('CMAKELISTS', 0)) BOOTLOADER_QA = ARGUMENTS.get('BOOTLOADER_QA', '0') == '1' PRODUCTION = 0 if BOOTLOADER_QA else ARGUMENTS.get('PRODUCTION', '0') == '1' HW_REVISION = ARGUMENTS.get('HW_REVISION', None) -NEW_RENDERING = ARGUMENTS.get('NEW_RENDERING', '1') == '1' or TREZOR_MODEL in ('T3T1',) MODEL_IDENTIFIER = models.get_model_identifier(TREZOR_MODEL) FEATURES_WANTED = ["input", "rgb_led", "consumption_mask", "usb", "optiga", "dma2d"] -if NEW_RENDERING: - FEATURES_WANTED.append("new_rendering") - CCFLAGS_MOD = '' CPPPATH_MOD = [] CPPDEFINES_MOD = [] @@ -66,8 +62,6 @@ CPPPATH_MOD += [ SOURCE_MOD += [ 'embed/extmod/modtrezorcrypto/rand.c', - 'embed/lib/buffers.c', - 'embed/lib/colors.c', 'embed/lib/display_utils.c', 'embed/lib/error_handling.c', 'embed/lib/flash_utils.c', @@ -81,22 +75,12 @@ SOURCE_MOD += [ 'embed/lib/mini_printf.c', 'embed/lib/rsod.c', 'embed/lib/terminal.c', + 'embed/lib/gfx_draw.c', 'vendor/micropython/lib/uzlib/adler32.c', 'vendor/micropython/lib/uzlib/crc32.c', 'vendor/micropython/lib/uzlib/tinflate.c', ] -if NEW_RENDERING: - CPPDEFINES_MOD += ['NEW_RENDERING'] - SOURCE_MOD += [ - 'embed/lib/gfx_draw.c', - ] -else: - SOURCE_MOD += [ - 'embed/lib/display_draw.c', - ] - - SOURCE_NANOPB = [ 'vendor/nanopb/pb_common.c', 'vendor/nanopb/pb_decode.c', @@ -216,9 +200,6 @@ def cargo_build(): features.append("bootloader") features.extend(FEATURES_AVAILABLE) - if NEW_RENDERING: - features.append('new_rendering') - cargo_opts = [ f'--target={env.get("ENV")["RUST_TARGET"]}', f'--target-dir=../../build/bootloader/rust', diff --git a/core/SConscript.bootloader_ci b/core/SConscript.bootloader_ci index 3e11207dcd..21adec4e87 100644 --- a/core/SConscript.bootloader_ci +++ b/core/SConscript.bootloader_ci @@ -6,14 +6,10 @@ import tools, models, ui TREZOR_MODEL = ARGUMENTS.get('TREZOR_MODEL', 'T') CMAKELISTS = int(ARGUMENTS.get('CMAKELISTS', 0)) HW_REVISION = ARGUMENTS.get('HW_REVISION', None) -NEW_RENDERING = ARGUMENTS.get('NEW_RENDERING', '1') == '1' or TREZOR_MODEL in ('T3T1',) MODEL_IDENTIFIER = models.get_model_identifier(TREZOR_MODEL) FEATURES_WANTED = ["input", "rgb_led", "consumption_mask", "usb", "optiga"] -if NEW_RENDERING: - FEATURES_WANTED.append("new_rendering") - CCFLAGS_MOD = '' CPPPATH_MOD = [] CPPDEFINES_MOD = [] @@ -61,7 +57,6 @@ CPPPATH_MOD += [ ] SOURCE_MOD += [ 'embed/extmod/modtrezorcrypto/rand.c', - 'embed/lib/colors.c', 'embed/lib/display_utils.c', 'embed/lib/error_handling.c', 'embed/lib/flash_utils.c', @@ -75,23 +70,12 @@ SOURCE_MOD += [ 'embed/lib/mini_printf.c', 'embed/lib/rsod.c', 'embed/lib/terminal.c', + 'embed/lib/gfx_draw.c', 'vendor/micropython/lib/uzlib/adler32.c', 'vendor/micropython/lib/uzlib/crc32.c', 'vendor/micropython/lib/uzlib/tinflate.c', ] - -if NEW_RENDERING: - CPPDEFINES_MOD += ['NEW_RENDERING'] - SOURCE_MOD += [ - 'embed/lib/gfx_draw.c', - ] -else: - SOURCE_MOD += [ - 'embed/lib/display_draw.c', - ] - - SOURCE_NANOPB = [ 'vendor/nanopb/pb_common.c', 'vendor/nanopb/pb_decode.c', diff --git a/core/SConscript.bootloader_emu b/core/SConscript.bootloader_emu index 06822faa68..f7a4ff21d2 100644 --- a/core/SConscript.bootloader_emu +++ b/core/SConscript.bootloader_emu @@ -6,7 +6,6 @@ import tools, models, ui TREZOR_MODEL = ARGUMENTS.get('TREZOR_MODEL', 'T') CMAKELISTS = int(ARGUMENTS.get('CMAKELISTS', 0)) HW_REVISION = 'emulator' -NEW_RENDERING = ARGUMENTS.get('NEW_RENDERING', '1') == '1' or TREZOR_MODEL in ('T3T1',) if not models.has_emulator(TREZOR_MODEL): # skip bootloader build @@ -22,9 +21,6 @@ if not models.has_emulator(TREZOR_MODEL): FEATURES_WANTED = ["input", "rgb_led", "dma2d", "optiga"] -if NEW_RENDERING: - FEATURES_WANTED.append("new_rendering") - CCFLAGS_MOD = '' CPPPATH_MOD = [] CPPDEFINES_HAL = [] @@ -72,7 +68,6 @@ CPPPATH_MOD += [ SOURCE_MOD += [ 'embed/extmod/modtrezorcrypto/rand.c', - 'embed/lib/colors.c', 'embed/lib/display_utils.c', 'embed/lib/error_handling.c', 'embed/lib/flash_utils.c', @@ -86,22 +81,13 @@ SOURCE_MOD += [ 'embed/lib/mini_printf.c', 'embed/lib/rsod.c', 'embed/lib/terminal.c', + 'embed/lib/gfx_draw.c', 'vendor/micropython/lib/uzlib/adler32.c', 'vendor/micropython/lib/uzlib/crc32.c', 'vendor/micropython/lib/uzlib/tinflate.c', 'vendor/trezor-storage/flash_area.c', ] -if NEW_RENDERING: - CPPDEFINES_MOD += ['NEW_RENDERING'] - SOURCE_MOD += [ - 'embed/lib/gfx_draw.c', - ] -else: - SOURCE_MOD += [ - 'embed/lib/display_draw.c', -] - SOURCE_NANOPB = [ 'vendor/nanopb/pb_common.c', 'vendor/nanopb/pb_decode.c', @@ -131,18 +117,9 @@ SOURCE_TREZORHAL = [ 'embed/trezorhal/unix/systimer.c', 'embed/trezorhal/unix/unit_properties.c', 'embed/trezorhal/unix/usb.c', + 'embed/trezorhal/unix/display_driver.c', ] -if NEW_RENDERING: - SOURCE_TREZORHAL += [ - 'embed/trezorhal/unix/display_driver.c', - 'embed/trezorhal/xdisplay_legacy.c', - ] -else: - SOURCE_TREZORHAL += [ - 'embed/trezorhal/unix/display-unix.c', - ] - SOURCE_UNIX = [ 'embed/unix/profile.c', ] @@ -238,9 +215,6 @@ RUST_LIBPATH = f'{RUST_LIBDIR}/lib{RUST_LIB}.a' def cargo_build(): features = [] - if NEW_RENDERING: - features.append('new_rendering') - features.extend(RUST_UI_FEATURES) features.append("ui") features.append("bootloader") diff --git a/core/SConscript.firmware b/core/SConscript.firmware index 1bb3985d47..12db71c48b 100644 --- a/core/SConscript.firmware +++ b/core/SConscript.firmware @@ -15,7 +15,6 @@ PYOPT = ARGUMENTS.get('PYOPT', '1') DISABLE_OPTIGA = ARGUMENTS.get('DISABLE_OPTIGA', '0') == '1' HW_REVISION = ARGUMENTS.get('HW_REVISION', None) THP = ARGUMENTS.get('THP', '0') == '1' # Trezor-Host Protocol -NEW_RENDERING = ARGUMENTS.get('NEW_RENDERING', '1') == '1' MODEL_IDENTIFIER = models.get_model_identifier(TREZOR_MODEL) BENCHMARK = ARGUMENTS.get('BENCHMARK', '0') == '1' @@ -32,8 +31,6 @@ FEATURE_FLAGS = { FEATURES_WANTED = ["input", "sbu", "sd_card", "rgb_led", "dma2d", "consumption_mask", "usb" ,"optiga", "haptic"] if DISABLE_OPTIGA and PYOPT == '0': FEATURES_WANTED.remove("optiga") -if NEW_RENDERING: - FEATURES_WANTED.append("new_rendering") CCFLAGS_MOD = '' CPPPATH_MOD = [] @@ -197,8 +194,6 @@ CPPPATH_MOD += [ ] SOURCE_MOD += [ 'embed/extmod/modtrezorui/modtrezorui.c', - 'embed/lib/buffers.c', - 'embed/lib/colors.c', 'embed/lib/display_utils.c', 'embed/lib/error_handling.c', 'embed/lib/fonts/font_bitmap.c', @@ -212,22 +207,12 @@ SOURCE_MOD += [ 'embed/lib/rsod.c', 'embed/lib/terminal.c', 'embed/lib/translations.c', + 'embed/lib/gfx_draw.c', 'vendor/micropython/lib/uzlib/adler32.c', 'vendor/micropython/lib/uzlib/crc32.c', 'vendor/micropython/lib/uzlib/tinflate.c', ] -if NEW_RENDERING: - CPPDEFINES_MOD += ['NEW_RENDERING'] - SOURCE_MOD += [ - 'embed/lib/gfx_draw.c', - ] -else: - SOURCE_MOD += [ - 'embed/lib/display_draw.c', - ] - - CPPDEFINES_MOD += [ 'TRANSLATIONS', 'FANCY_FATAL_ERROR', @@ -760,10 +745,6 @@ def cargo_build(): features.append('ui') features.append('translations') - - if NEW_RENDERING: - features.append('new_rendering') - if PYOPT == '0': features.append('debug') features.append('ui_debug') diff --git a/core/SConscript.kernel b/core/SConscript.kernel index af58880b68..ae051c273e 100644 --- a/core/SConscript.kernel +++ b/core/SConscript.kernel @@ -15,8 +15,6 @@ PYOPT = ARGUMENTS.get('PYOPT', '1') DISABLE_OPTIGA = ARGUMENTS.get('DISABLE_OPTIGA', '0') == '1' HW_REVISION = ARGUMENTS.get('HW_REVISION', None) THP = ARGUMENTS.get('THP', '0') == '1' # Trezor-Host Protocol -NEW_RENDERING = ARGUMENTS.get('NEW_RENDERING', '1') == '1' or TREZOR_MODEL in ('T3T1',) - FEATURE_FLAGS = { "RDI": True, @@ -28,8 +26,6 @@ FEATURE_FLAGS = { FEATURES_WANTED = ["input", "sbu", "sd_card", "rgb_led", "dma2d", "consumption_mask", "usb" ,"optiga", "haptic"] if DISABLE_OPTIGA and PYOPT == '0': FEATURES_WANTED.remove("optiga") -if NEW_RENDERING: - FEATURES_WANTED.append("new_rendering") CCFLAGS_MOD = '' CPPPATH_MOD = [] @@ -184,8 +180,6 @@ if FEATURE_FLAGS["AES_GCM"]: SOURCE_MOD += [ 'embed/lib/bl_check.c', -# 'embed/lib/buffers.c', -# 'embed/lib/colors.c', # 'embed/lib/display_utils.c', 'embed/lib/error_handling.c', 'embed/lib/fonts/font_bitmap.c', @@ -199,23 +193,13 @@ SOURCE_MOD += [ 'embed/lib/rsod.c', 'embed/lib/terminal.c', 'embed/lib/translations.c', + 'embed/lib/gfx_draw.c', 'embed/extmod/modtrezorcrypto/rand.c', 'vendor/micropython/lib/uzlib/adler32.c', 'vendor/micropython/lib/uzlib/crc32.c', 'vendor/micropython/lib/uzlib/tinflate.c', ] -if NEW_RENDERING: - CPPDEFINES_MOD += ['NEW_RENDERING'] - SOURCE_MOD += [ - 'embed/lib/gfx_draw.c', - ] -else: - SOURCE_MOD += [ - 'embed/lib/display_draw.c', - ] - - CPPDEFINES_MOD += [ 'TRANSLATIONS', 'RSOD_IN_COREAPP', diff --git a/core/SConscript.prodtest b/core/SConscript.prodtest index 0fafdc0928..ad391f970a 100644 --- a/core/SConscript.prodtest +++ b/core/SConscript.prodtest @@ -8,13 +8,9 @@ CMAKELISTS = int(ARGUMENTS.get('CMAKELISTS', 0)) PRODUCTION = ARGUMENTS.get('PRODUCTION', '0') == '1' BOOTLOADER_DEVEL = ARGUMENTS.get('BOOTLOADER_DEVEL', '0') == '1' HW_REVISION = ARGUMENTS.get('HW_REVISION', None) -NEW_RENDERING = ARGUMENTS.get('NEW_RENDERING', '1') == '1' FEATURES_WANTED = ["input", "sbu", "sd_card", "rdb_led", "usb", "consumption_mask", "optiga", "haptic"] -if NEW_RENDERING: - FEATURES_WANTED.append("new_rendering") - CCFLAGS_MOD = '' CPPPATH_MOD = [] CPPDEFINES_MOD = [ @@ -66,7 +62,6 @@ CPPPATH_MOD += [ ] SOURCE_MOD += [ - 'embed/lib/colors.c', 'embed/lib/display_utils.c', 'embed/lib/error_handling.c', 'embed/lib/fonts/font_bitmap.c', @@ -80,22 +75,12 @@ SOURCE_MOD += [ 'embed/lib/rsod.c', 'embed/lib/qr-code-generator/qrcodegen.c', 'embed/lib/terminal.c', + 'embed/lib/gfx_draw.c', 'vendor/micropython/lib/uzlib/adler32.c', 'vendor/micropython/lib/uzlib/crc32.c', 'vendor/micropython/lib/uzlib/tinflate.c', ] - -if NEW_RENDERING: - CPPDEFINES_MOD += ['NEW_RENDERING'] - SOURCE_MOD += [ - 'embed/lib/gfx_draw.c', - ] -else: - SOURCE_MOD += [ - 'embed/lib/display_draw.c', - ] - ui.init_ui(TREZOR_MODEL, "prodtest", CPPDEFINES_MOD, SOURCE_MOD, RUST_UI_FEATURES) env = Environment( diff --git a/core/SConscript.reflash b/core/SConscript.reflash index 1309f58d44..975d50d7fa 100644 --- a/core/SConscript.reflash +++ b/core/SConscript.reflash @@ -6,7 +6,6 @@ import tools, models, ui TREZOR_MODEL = ARGUMENTS.get('TREZOR_MODEL', 'T') CMAKELISTS = int(ARGUMENTS.get('CMAKELISTS', 0)) HW_REVISION = ARGUMENTS.get('HW_REVISION', None) -NEW_RENDERING = ARGUMENTS.get('NEW_RENDERING', '1') == '1' if TREZOR_MODEL in ('DISC1', 'DISC2'): # skip reflash build @@ -21,9 +20,6 @@ if TREZOR_MODEL in ('DISC1', 'DISC2'): FEATURES_WANTED = ["input", "sd_card"] -if NEW_RENDERING: - FEATURES_WANTED.append("new_rendering") - CCFLAGS_MOD = '' CPPPATH_MOD = [] CPPDEFINES_MOD = [] @@ -52,7 +48,6 @@ CPPPATH_MOD += [ 'vendor/micropython/lib/uzlib', ] SOURCE_MOD += [ - 'embed/lib/colors.c', 'embed/lib/display_utils.c', 'embed/lib/error_handling.c', 'embed/lib/fonts/font_bitmap.c', @@ -65,23 +60,13 @@ SOURCE_MOD += [ 'embed/lib/mini_printf.c', 'embed/lib/rsod.c', 'embed/lib/terminal.c', + 'embed/lib/gfx_draw.c', 'vendor/micropython/lib/uzlib/adler32.c', 'vendor/micropython/lib/uzlib/crc32.c', 'vendor/micropython/lib/uzlib/tinflate.c', 'vendor/trezor-storage/flash_area.c', ] -if NEW_RENDERING: - CPPDEFINES_MOD += ['NEW_RENDERING'] - SOURCE_MOD += [ - 'embed/lib/gfx_draw.c', - ] -else: - SOURCE_MOD += [ - 'embed/lib/display_draw.c', - ] - - ui.init_ui(TREZOR_MODEL, "prodtest", CPPDEFINES_MOD, SOURCE_MOD, RUST_UI_FEATURES) env = Environment( diff --git a/core/SConscript.unix b/core/SConscript.unix index fb20846d9e..46e89be20c 100644 --- a/core/SConscript.unix +++ b/core/SConscript.unix @@ -10,7 +10,6 @@ TREZOR_MODEL = ARGUMENTS.get('TREZOR_MODEL', 'T') CMAKELISTS = int(ARGUMENTS.get('CMAKELISTS', 0)) HW_REVISION ='emulator' THP = ARGUMENTS.get('THP', '0') == '1' # Trezor-Host Protocol -NEW_RENDERING = ARGUMENTS.get('NEW_RENDERING', '1') == '1' BENCHMARK = ARGUMENTS.get('BENCHMARK', '0') == '1' PYOPT = ARGUMENTS.get('PYOPT', '1') FROZEN = ARGUMENTS.get('TREZOR_EMULATOR_FROZEN', 0) @@ -22,8 +21,6 @@ if BENCHMARK and PYOPT != '0': exit(1) FEATURES_WANTED = ["input", "sd_card", "dma2d", "optiga", "sbu"] -if NEW_RENDERING: - FEATURES_WANTED.append("new_rendering") if not models.has_emulator(TREZOR_MODEL): # skip unix build @@ -208,7 +205,6 @@ CPPPATH_MOD += [ ] SOURCE_MOD += [ 'embed/extmod/modtrezorui/modtrezorui.c', - 'embed/lib/colors.c', 'embed/lib/display_utils.c', 'embed/lib/error_handling.c', 'embed/lib/fonts/font_bitmap.c', @@ -222,20 +218,12 @@ SOURCE_MOD += [ 'embed/lib/rsod.c', 'embed/lib/terminal.c', 'embed/lib/translations.c', + 'embed/lib/gfx_draw.c', 'vendor/micropython/lib/uzlib/adler32.c', 'vendor/micropython/lib/uzlib/crc32.c', 'vendor/micropython/lib/uzlib/tinflate.c', ] -if NEW_RENDERING: - SOURCE_MOD += [ - 'embed/lib/gfx_draw.c', - ] -else: - SOURCE_MOD += [ - 'embed/lib/display_draw.c', - ] - CPPDEFINES_MOD += [ 'TRANSLATIONS', 'FANCY_FATAL_ERROR', @@ -246,9 +234,6 @@ if FROZEN: if RASPI: CPPDEFINES_MOD += ['TREZOR_EMULATOR_RASPI'] -if NEW_RENDERING: - CPPDEFINES_MOD += ['NEW_RENDERING'] - # modtrezorutils SOURCE_MOD += [ 'embed/extmod/modtrezorutils/modtrezorutils.c', @@ -405,6 +390,7 @@ SOURCE_UNIX = [ 'embed/trezorhal/unix/time_estimate.c', 'embed/trezorhal/unix/unit_properties.c', 'embed/trezorhal/unix/usb.c', + 'embed/trezorhal/unix/display_driver.c', 'embed/unix/main_main.c', 'embed/unix/main.c', 'embed/unix/profile.c', @@ -415,16 +401,6 @@ SOURCE_UNIX = [ 'vendor/micropython/shared/runtime/gchelper_generic.c', ] -if NEW_RENDERING: - SOURCE_MOD += [ - 'embed/trezorhal/unix/display_driver.c', - 'embed/trezorhal/xdisplay_legacy.c', - ] -else: - SOURCE_MOD += [ - 'embed/trezorhal/unix/display-unix.c', - ] - TRANSLATION_DATA = [ "translations/en.json", "translations/order.json", @@ -831,9 +807,6 @@ def cargo_build(): features.extend(FEATURES_AVAILABLE) - if NEW_RENDERING: - features.append('new_rendering') - env.get('ENV')['TREZOR_MODEL'] = TREZOR_MODEL bindgen_macros = tools.get_bindgen_defines(env.get("CPPDEFINES"), ALLPATHS) diff --git a/core/embed/boardloader/main.c b/core/embed/boardloader/main.c index e429e0a483..4b7e30517b 100644 --- a/core/embed/boardloader/main.c +++ b/core/embed/boardloader/main.c @@ -22,12 +22,11 @@ #include "board_capabilities.h" #include "bootutils.h" -#include "buffers.h" #include "compiler_traits.h" #include "display.h" -#include "display_draw.h" #include "flash.h" #include "flash_utils.h" +#include "gfx_draw.h" #include "image.h" #include "mpu.h" #include "pvd.h" @@ -50,11 +49,7 @@ #endif #ifdef USE_DMA2D -#ifdef NEW_RENDERING #include "dma2d_bitblt.h" -#else -#include "dma2d.h" -#endif #endif #include "memzero.h" @@ -104,7 +99,8 @@ struct BoardCapabilities capabilities .terminator_length = 0}; // we use SRAM as SD card read buffer (because DMA can't access the CCMRAM) -BUFFER_SECTION uint32_t sdcard_buf[BOOTLOADER_MAXSIZE / sizeof(uint32_t)]; +__attribute__((section(".buf"))) +uint32_t sdcard_buf[BOOTLOADER_MAXSIZE / sizeof(uint32_t)]; #if defined USE_SD_CARD static uint32_t check_sdcard(void) { @@ -182,7 +178,7 @@ static uint32_t check_sdcard(void) { static void progress_callback(int pos, int len) { term_printf("."); } static secbool copy_sdcard(void) { - display_backlight(255); + display_set_backlight(255); term_printf("Trezor Boardloader\n"); term_printf("==================\n\n"); @@ -269,7 +265,7 @@ int main(void) { display_init(DISPLAY_RESET_CONTENT); - display_clear(); + gfx_clear(); display_refresh(); #if defined USE_SD_CARD diff --git a/core/embed/bootloader/bootui.c b/core/embed/bootloader/bootui.c index 6b173e892a..0669166e82 100644 --- a/core/embed/bootloader/bootui.c +++ b/core/embed/bootloader/bootui.c @@ -20,9 +20,7 @@ #include #include "bootui.h" -#include "colors.h" #include "display.h" -#include "display_draw.h" #include "display_utils.h" #include "fonts/fonts.h" #include "mini_printf.h" @@ -68,83 +66,10 @@ static void format_ver(const char *format, uint32_t version, char *buffer, // boot UI -#ifndef NEW_RENDERING -static uint16_t boot_background; -#endif - static bool initial_setup = true; void ui_set_initial_setup(bool initial) { initial_setup = initial; } -#ifndef NEW_RENDERING -static void ui_screen_boot_old(const vendor_header *const vhdr, - const image_header *const hdr) { - const int show_string = ((vhdr->vtrust & VTRUST_NO_STRING) == 0); - if ((vhdr->vtrust & VTRUST_NO_RED) != 0) { - boot_background = COLOR_BLACK; - } else { - boot_background = COLOR_BL_FAIL; - } - - const uint8_t *vimg = vhdr->vimg; - const uint32_t fw_version = hdr->version; - - display_bar(0, 0, DISPLAY_RESX, DISPLAY_RESY, boot_background); - -#if !defined TREZOR_MODEL_R && !defined TREZOR_MODEL_T3B1 - int image_top = show_string ? 30 : (DISPLAY_RESY - 120) / 2; - // check whether vendor image is 120x120 - if (memcmp(vimg, "TOIF\x78\x00\x78\x00", 8) == 0) { - uint32_t datalen = TOIF_LENGTH(vimg); - display_image((DISPLAY_RESX - 120) / 2, image_top, vimg, datalen); - } - - if (show_string) { - char ver_str[64]; - display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY - 5 - 50, vhdr->vstr, - vhdr->vstr_len, FONT_NORMAL, COLOR_BL_BG, - boot_background); - format_ver("%d.%d.%d", fw_version, ver_str, sizeof(ver_str)); - display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY - 5 - 25, ver_str, -1, - FONT_NORMAL, COLOR_BL_BG, boot_background); - } -#else - // check whether vendor image is 24x24 - if (memcmp(vimg, "TOIG\x18\x00\x18\x00", 8) == 0) { - uint32_t datalen = TOIF_LENGTH(vimg); - display_icon((DISPLAY_RESX - 22) / 2, 0, vimg, datalen, COLOR_BL_BG, - boot_background); - } - - if (show_string) { - char ver_str[64]; - display_text_center(DISPLAY_RESX / 2, 36, vhdr->vstr, vhdr->vstr_len, - FONT_NORMAL, COLOR_BL_BG, boot_background); - format_ver("%d.%d.%d", fw_version, ver_str, sizeof(ver_str)); - display_text_center(DISPLAY_RESX / 2, 46, ver_str, -1, FONT_NORMAL, - COLOR_BL_BG, boot_background); - } - -#endif - - display_pixeldata_dirty(); - display_refresh(); -} -#endif - -#ifndef NEW_RENDERING -static void ui_screen_boot_wait(int wait_seconds) { - char wait_str[32]; - mini_snprintf(wait_str, sizeof(wait_str), "starting in %d s", wait_seconds); - display_bar(0, BOOT_WAIT_Y_TOP, DISPLAY_RESX, BOOT_WAIT_HEIGHT, - boot_background); - display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY - 5, wait_str, -1, - FONT_NORMAL, COLOR_BL_BG, boot_background); - display_pixeldata_dirty(); - display_refresh(); -} -#endif - #if defined USE_TOUCH #include "touch.h" @@ -185,18 +110,6 @@ void ui_click(void) { #error "No input method defined" #endif -#ifndef NEW_RENDERING -static void ui_screen_boot_click(void) { - display_bar(0, BOOT_WAIT_Y_TOP, DISPLAY_RESX, BOOT_WAIT_HEIGHT, - boot_background); - bld_continue_label(boot_background); - display_pixeldata_dirty(); - display_refresh(); - ui_click(); -} -#endif - -#ifdef NEW_RENDERING void ui_screen_boot(const vendor_header *const vhdr, const image_header *const hdr, int wait) { bool show_string = ((vhdr->vtrust & VTRUST_NO_STRING) == 0); @@ -208,19 +121,6 @@ void ui_screen_boot(const vendor_header *const vhdr, screen_boot(red_screen, vendor_str, vendor_str_len, hdr->version, vhdr->vimg, vimg_len, wait); } -#else // NEW_RENDERING - -void ui_screen_boot(const vendor_header *const vhdr, - const image_header *const hdr, int wait) { - if (wait == 0) { - ui_screen_boot_old(vhdr, hdr); - } else if (wait > 0) { - ui_screen_boot_wait(wait); - } else { - ui_screen_boot_click(); - } -} -#endif // welcome UI @@ -302,7 +202,4 @@ void ui_screen_install_restricted(void) { screen_install_fail(); } void ui_fadein(void) { display_fade(0, BACKLIGHT_NORMAL, 1000); } -void ui_fadeout(void) { - display_fade(BACKLIGHT_NORMAL, 0, 500); - display_clear(); -} +void ui_fadeout(void) { display_fade(BACKLIGHT_NORMAL, 0, 500); } diff --git a/core/embed/bootloader/main.c b/core/embed/bootloader/main.c index d1ba77e81f..db3818d016 100644 --- a/core/embed/bootloader/main.c +++ b/core/embed/bootloader/main.c @@ -42,11 +42,7 @@ #include "systimer.h" #ifdef USE_DMA2D -#ifdef NEW_RENDERING #include "dma2d_bitblt.h" -#else -#include "dma2d.h" -#endif #endif #ifdef USE_OPTIGA #include "optiga_hal.h" @@ -342,7 +338,7 @@ void real_jump_to_firmware(void) { #ifdef USE_RESET_TO_BOOT __attribute__((noreturn)) void jump_to_fw_through_reset(void) { - display_fade(display_backlight(-1), 0, 200); + display_fade(display_get_backlight(), 0, 200); reboot_device(); } diff --git a/core/embed/bootloader_ci/bootui.c b/core/embed/bootloader_ci/bootui.c index 580bc13646..29bffd49bd 100644 --- a/core/embed/bootloader_ci/bootui.c +++ b/core/embed/bootloader_ci/bootui.c @@ -17,12 +17,14 @@ * along with this program. If not, see . */ +#include #include #include "bootui.h" #include "display.h" -#include "display_draw.h" #include "display_utils.h" +#include "fonts/fonts.h" +#include "gfx_draw.h" #include "icon_done.h" #include "icon_fail.h" #include "icon_install.h" @@ -50,19 +52,30 @@ // welcome UI +gfx_text_attr_t welcome_text_attr = { + .font = FONT_NORMAL, + .fg_color = COLOR_WELCOME_FG, + .bg_color = COLOR_WELCOME_BG, +}; + +gfx_text_attr_t normal_text_attr = { + .font = FONT_NORMAL, + .fg_color = COLOR_BL_FG, + .bg_color = COLOR_BL_BG, +}; + void ui_screen_welcome_third(void) { - display_bar(0, 0, DISPLAY_RESX, DISPLAY_RESY, COLOR_WELCOME_BG); - display_text_center(120, 220, "Go to trezor.io/start", -1, FONT_NORMAL, - COLOR_WELCOME_FG, COLOR_WELCOME_BG); + gfx_draw_bar(gfx_rect_wh(0, 0, DISPLAY_RESX, DISPLAY_RESY), COLOR_WELCOME_BG); + gfx_draw_text(gfx_offset(120, 220), "Go to trezor.io/start", -1, + &welcome_text_attr, GFX_ALIGN_CENTER); } // install UI void ui_screen_install_start(void) { - display_bar(0, 0, DISPLAY_RESX, DISPLAY_RESY, COLOR_BL_BG); - display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY - 24, - "Installing firmware", -1, FONT_NORMAL, COLOR_BL_FG, - COLOR_BL_BG); + gfx_draw_bar(gfx_rect_wh(0, 0, DISPLAY_RESX, DISPLAY_RESY), COLOR_BL_BG); + gfx_draw_text(gfx_offset(DISPLAY_RESX / 2, DISPLAY_RESY - 24), + "Installing firmware", -1, &normal_text_attr, GFX_ALIGN_CENTER); } void ui_screen_install_progress_erase(int pos, int len) {} @@ -72,9 +85,9 @@ void ui_screen_install_progress_upload(int pos) {} // wipe UI void ui_screen_wipe(void) { - display_bar(0, 0, DISPLAY_RESX, DISPLAY_RESY, COLOR_BL_BG); - display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY - 24, "Wiping device", -1, - FONT_NORMAL, COLOR_BL_FG, COLOR_BL_BG); + gfx_draw_bar(gfx_rect_wh(0, 0, DISPLAY_RESX, DISPLAY_RESY), COLOR_BL_BG); + gfx_draw_text(gfx_offset(DISPLAY_RESX / 2, DISPLAY_RESY - 24), + "Wiping device", -1, &normal_text_attr, GFX_ALIGN_CENTER); } void ui_screen_wipe_progress(int pos, int len) {} @@ -92,29 +105,27 @@ void ui_screen_done(int restart_seconds, secbool full_redraw) { str = "Done! Unplug the device."; } if (sectrue == full_redraw) { - display_bar(0, 0, DISPLAY_RESX, DISPLAY_RESY, COLOR_BL_BG); + gfx_draw_bar(gfx_rect_wh(0, 0, DISPLAY_RESX, DISPLAY_RESY), COLOR_BL_BG); } if (secfalse == full_redraw) { - display_bar(0, DISPLAY_RESY - 24 - 18, 240, 23, COLOR_BL_BG); + gfx_draw_bar(gfx_rect_wh(0, DISPLAY_RESY - 24 - 18, 240, 23), COLOR_BL_BG); } - display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY - 24, str, -1, FONT_NORMAL, - COLOR_BL_FG, COLOR_BL_BG); + + gfx_draw_text(gfx_offset(DISPLAY_RESX / 2, DISPLAY_RESY - 24), str, -1, + &normal_text_attr, GFX_ALIGN_CENTER); } // error UI void ui_screen_fail(void) { - display_bar(0, 0, DISPLAY_RESX, DISPLAY_RESY, COLOR_BL_BG); - display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY - 24, - "Failed! Please, reconnect.", -1, FONT_NORMAL, - COLOR_BL_FG, COLOR_BL_BG); + gfx_draw_bar(gfx_rect_wh(0, 0, DISPLAY_RESX, DISPLAY_RESY), COLOR_BL_BG); + gfx_draw_text(gfx_offset(DISPLAY_RESX / 2, DISPLAY_RESY - 24), + "Failed! Please, reconnect.", -1, &normal_text_attr, + GFX_ALIGN_CENTER); } // general functions void ui_fadein(void) { display_fade(0, BACKLIGHT_NORMAL, 1000); } -void ui_fadeout(void) { - display_fade(BACKLIGHT_NORMAL, 0, 500); - display_clear(); -} +void ui_fadeout(void) { display_fade(BACKLIGHT_NORMAL, 0, 500); } diff --git a/core/embed/bootloader_ci/main.c b/core/embed/bootloader_ci/main.c index bc4a8d4782..ab720f6173 100644 --- a/core/embed/bootloader_ci/main.c +++ b/core/embed/bootloader_ci/main.c @@ -23,9 +23,9 @@ #include #include "bootutils.h" #include "display.h" -#include "display_draw.h" #include "flash.h" #include "flash_otp.h" +#include "gfx_draw.h" #include "image.h" #include "mini_printf.h" #include "mpu.h" @@ -194,7 +194,7 @@ int main(void) { ensure_bootloader_min_version(); #endif - display_clear(); + gfx_clear(); const image_header *hdr = NULL; vendor_header vhdr; diff --git a/core/embed/extmod/modtrezorio/modtrezorio-poll.h b/core/embed/extmod/modtrezorio/modtrezorio-poll.h index c795282e56..42a6b5150a 100644 --- a/core/embed/extmod/modtrezorio/modtrezorio-poll.h +++ b/core/embed/extmod/modtrezorio/modtrezorio-poll.h @@ -17,6 +17,7 @@ * along with this program. If not, see . */ +#include #include #include "button.h" @@ -106,7 +107,7 @@ STATIC mp_obj_t mod_trezorio_poll(mp_obj_t ifaces, mp_obj_t list_ref, const uint32_t ey = evt & 0xFFFU; // y position uint32_t exr; // rotated x position uint32_t eyr; // rotated y position - switch (display_orientation(-1)) { + switch (display_get_orientation()) { case 90: exr = ey; eyr = DISPLAY_RESX - ex; @@ -149,7 +150,7 @@ STATIC mp_obj_t mod_trezorio_poll(mp_obj_t ifaces, mp_obj_t list_ref, mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR(mp_obj_new_tuple(2, NULL)); uint32_t etype = (evt >> 24) & 0x3U; // button down/up uint32_t en = evt & 0xFFFF; // button number - if (display_orientation(-1) == 180) { + if (display_get_orientation() == 180) { en = (en == BTN_LEFT) ? BTN_RIGHT : BTN_LEFT; } tuple->items[0] = MP_OBJ_NEW_SMALL_INT(etype); diff --git a/core/embed/extmod/modtrezorui/modtrezorui-display.h b/core/embed/extmod/modtrezorui/modtrezorui-display.h index ee7bc030e5..d6fce1dd16 100644 --- a/core/embed/extmod/modtrezorui/modtrezorui-display.h +++ b/core/embed/extmod/modtrezorui/modtrezorui-display.h @@ -17,9 +17,11 @@ * along with this program. If not, see . */ +#include + #include "display.h" -#include "display_draw.h" #include "fonts/fonts.h" +#include "gfx_draw.h" /// class Display: /// """ @@ -70,7 +72,7 @@ STATIC mp_obj_t mod_trezorui_Display_bar(size_t n_args, const mp_obj_t *args) { mp_int_t w = mp_obj_get_int(args[3]); mp_int_t h = mp_obj_get_int(args[4]); uint16_t c = mp_obj_get_int(args[5]); - display_bar(x, y, w, h, c); + gfx_draw_bar(gfx_rect(x, y, w, h), gfx_color16_to_color(c)); return mp_const_none; } STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_trezorui_Display_bar_obj, 6, 6, @@ -91,9 +93,9 @@ STATIC mp_obj_t mod_trezorui_Display_orientation(size_t n_args, if (deg != 0 && deg != 90 && deg != 180 && deg != 270) { mp_raise_ValueError("Value must be 0, 90, 180 or 270"); } - deg = display_orientation(deg); + deg = display_set_orientation(deg); } else { - deg = display_orientation(-1); + deg = display_get_orientation(); } return MP_OBJ_NEW_SMALL_INT(deg); } @@ -114,9 +116,9 @@ STATIC mp_obj_t mod_trezorui_Display_backlight(size_t n_args, if (val < 0 || val > 255) { mp_raise_ValueError("Value must be between 0 and 255"); } - val = display_backlight(val); + val = display_set_backlight(val); } else { - val = display_backlight(-1); + val = display_get_backlight(); } return MP_OBJ_NEW_SMALL_INT(val); } diff --git a/core/embed/kernel/main.c b/core/embed/kernel/main.c index b140a3c87c..62894244d0 100644 --- a/core/embed/kernel/main.c +++ b/core/embed/kernel/main.c @@ -26,7 +26,7 @@ #include "button.h" #include "consumption_mask.h" #include "display.h" -#include "dma2d.h" +#include "dma2d_bitblt.h" #include "entropy.h" #include "haptic.h" #include "image.h" diff --git a/core/embed/lib/buffers.c b/core/embed/lib/buffers.c deleted file mode 100644 index eddaef5607..0000000000 --- a/core/embed/lib/buffers.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - * This file is part of the Trezor project, https://trezor.io/ - * - * Copyright (c) SatoshiLabs - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include - -#include "buffers.h" -#include "fonts/fonts.h" -#include "memzero.h" - -const int32_t text_buffer_height = FONT_MAX_HEIGHT; -const int32_t buffer_width = DISPLAY_RESX; - -#define CONCAT_(a, b) a##b -#define CONCAT(a, b) CONCAT_(a, b) - -#define CONCAT3_(a, b, c) a##b##c -#define CONCAT3(a, b, c) CONCAT3_(a, b, c) - -#define STRUCT(name) CONCAT3(buffers_, name, _t) -#define TYPE(name) CONCAT3(buffer_, name, _t) -#define FUNCTION(name) CONCAT(buffers_get_, name) -#define FUNCTION_FREE(name) CONCAT(buffers_free_, name) -#define VARNAME(name) CONCAT(buffers_, name) - -#define BUFFER(section, name, count) \ - typedef struct { \ - TYPE(name) buffers[count]; \ - uint8_t allocated[count]; \ - } STRUCT(name); \ - section STRUCT(name) VARNAME(name); \ - \ - TYPE(name) * FUNCTION(name)(bool clear) { \ - int idx = -1; \ - for (int i = 0; i < (count); i++) { \ - if (VARNAME(name).allocated[i] == 0) { \ - idx = i; \ - break; \ - } \ - } \ - if (idx < 0) { \ - return NULL; \ - } \ - if (clear) { \ - memzero(&VARNAME(name).buffers[idx], \ - sizeof(VARNAME(name).buffers[idx])); \ - } \ - VARNAME(name).allocated[idx] = 1; \ - return &VARNAME(name).buffers[idx]; \ - } \ - void FUNCTION_FREE(name)(TYPE(name) * buffer) { \ - if (buffer == NULL) { \ - return; \ - } \ - for (uint16_t i = 0; i < (count); i++) { \ - if (buffer == &VARNAME(name).buffers[i]) { \ - VARNAME(name).allocated[i] = 0; \ - return; \ - } \ - } \ - } - -BUFFER(BUFFER_SECTION, line_16bpp, 3); -BUFFER(BUFFER_SECTION, line_4bpp, 3); -BUFFER(BUFFER_SECTION, text, 1); -BUFFER(NODMA_BUFFER_SECTION, jpeg, 1); -BUFFER(NODMA_BUFFER_SECTION, jpeg_work, 1); -BUFFER(NODMA_BUFFER_SECTION, blurring, 1); -BUFFER(NODMA_BUFFER_SECTION, blurring_totals, 1); diff --git a/core/embed/lib/buffers.h b/core/embed/lib/buffers.h deleted file mode 100644 index 6eac01580d..0000000000 --- a/core/embed/lib/buffers.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - * This file is part of the Trezor project, https://trezor.io/ - * - * Copyright (c) SatoshiLabs - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef _BUFFERS_H -#define _BUFFERS_H - -#include -#include - -#define BUFFER_PIXELS DISPLAY_RESX - -#define TEXT_BUFFER_HEIGHT 36 - -#if TEXT_BUFFER_HEIGHT < FONT_MAX_HEIGHT -#error Text buffer height is too small, please adjust to match used fonts -#endif - -#define LINE_BUFFER_16BPP_SIZE (BUFFER_PIXELS * 2) -#define LINE_BUFFER_4BPP_SIZE (BUFFER_PIXELS / 2) -#define TEXT_BUFFER_SIZE ((BUFFER_PIXELS * TEXT_BUFFER_HEIGHT) / 2) -#define JPEG_BUFFER_SIZE (BUFFER_PIXELS * 16) - -// 3100 is needed according to tjpgd docs, -// 256 because we need non overlapping memory in rust -// 6 << 10 is for huffman decoding table -// 1000 bytes reserve, as we discovered that we are running out of memory -// sometimes -#define JPEG_WORK_SIZE (3100 + 256 + (6 << 10) + 1000) - -#if defined BOOTLOADER || defined BOARDLOADER -#define BUFFER_SECTION __attribute__((section(".buf"))) -#else -#define BUFFER_SECTION -#endif - -#if defined BOOTLOADER || defined TREZOR_EMULATOR -#define NODMA_BUFFER_SECTION -#else -#define NODMA_BUFFER_SECTION __attribute__((section(".no_dma_buffers"))) -#endif - -typedef __attribute__((aligned(4))) struct { - uint8_t buffer[LINE_BUFFER_16BPP_SIZE]; -} buffer_line_16bpp_t; - -typedef __attribute__((aligned(4))) struct { - uint8_t buffer[LINE_BUFFER_4BPP_SIZE]; -} buffer_line_4bpp_t; - -typedef __attribute__((aligned(4))) struct { - uint8_t buffer[TEXT_BUFFER_SIZE]; -} buffer_text_t; - -typedef __attribute__((aligned(4))) struct { - uint16_t buffer[JPEG_BUFFER_SIZE]; -} buffer_jpeg_t; - -typedef __attribute__((aligned(4))) struct { - uint8_t buffer[JPEG_WORK_SIZE]; -} buffer_jpeg_work_t; - -typedef __attribute__((aligned(4))) struct { - uint16_t buffer[10][3][BUFFER_PIXELS]; -} buffer_blurring_t; - -typedef __attribute__((aligned(4))) struct { - uint16_t buffer[3][BUFFER_PIXELS]; -} buffer_blurring_totals_t; - -extern const int32_t text_buffer_height; -extern const int32_t buffer_width; - -buffer_line_16bpp_t* buffers_get_line_16bpp(bool clear); -void buffers_free_line_16bpp(buffer_line_16bpp_t* buffer); - -buffer_line_4bpp_t* buffers_get_line_4bpp(bool clear); -void buffers_free_line_4bpp(buffer_line_4bpp_t* buffer); - -buffer_text_t* buffers_get_text(bool clear); -void buffers_free_text(buffer_text_t* buffer); - -buffer_jpeg_t* buffers_get_jpeg(bool clear); -void buffers_free_jpeg(buffer_jpeg_t* buffer); - -buffer_jpeg_work_t* buffers_get_jpeg_work(bool clear); -void buffers_free_jpeg_work(buffer_jpeg_work_t* buffer); - -buffer_blurring_t* buffers_get_blurring(bool clear); -void buffers_free_blurring(buffer_blurring_t* buffer); - -buffer_blurring_totals_t* buffers_get_blurring_totals(bool clear); -void buffers_free_blurring_totals(buffer_blurring_totals_t* buffer); - -#endif // _BUFFERS_H diff --git a/core/embed/lib/colors.c b/core/embed/lib/colors.c deleted file mode 100644 index f12eff8540..0000000000 --- a/core/embed/lib/colors.c +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is part of the Trezor project, https://trezor.io/ - * - * Copyright (c) SatoshiLabs - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "colors.h" - -uint32_t rgb565_to_rgb888(uint16_t color) { - uint32_t res = 0; - res |= ((((((uint32_t)color & 0xF800) >> 11) * 527) + 23) >> 6) << 16; - res |= ((((((uint32_t)color & 0x07E0) >> 5) * 259) + 33) >> 6) << 8; - res |= ((((((uint32_t)color & 0x001F) >> 0) * 527) + 23) >> 6) << 0; - res |= 0xFF000000; - return res; -} - -uint32_t interpolate_rgb888_color(uint32_t color0, uint32_t color1, - uint8_t step) { - uint32_t cr, cg, cb; - cr = (((color0 & 0xFF0000) >> 16) * step + - ((color1 & 0xFF0000) >> 16) * (15 - step)) / - 15; - cg = (((color0 & 0xFF00) >> 8) * step + - ((color1 & 0xFF00) >> 8) * (15 - step)) / - 15; - cb = ((color0 & 0x00FF) * step + (color1 & 0x00FF) * (15 - step)) / 15; - return (cr << 16) | (cg << 8) | cb | 0xFF000000; -} diff --git a/core/embed/lib/colors.h b/core/embed/lib/colors.h deleted file mode 100644 index 7a92ca1761..0000000000 --- a/core/embed/lib/colors.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * This file is part of the Trezor project, https://trezor.io/ - * - * Copyright (c) SatoshiLabs - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef _COLORS_H -#define _COLORS_H - -#include - -#ifdef USE_RGB_COLORS -#define RGB16(R, G, B) ((R & 0xF8) << 8) | ((G & 0xFC) << 3) | ((B & 0xF8) >> 3) -#endif - -#define COLOR_WHITE 0xFFFF -#define COLOR_BLACK 0x0000 - -static inline uint16_t interpolate_color(uint16_t color0, uint16_t color1, - uint8_t step) { - uint8_t cr = 0, cg = 0, cb = 0; - cr = (((color0 & 0xF800) >> 11) * step + - ((color1 & 0xF800) >> 11) * (15 - step)) / - 15; - cg = (((color0 & 0x07E0) >> 5) * step + - ((color1 & 0x07E0) >> 5) * (15 - step)) / - 15; - cb = ((color0 & 0x001F) * step + (color1 & 0x001F) * (15 - step)) / 15; - return (cr << 11) | (cg << 5) | cb; -} - -static inline void set_color_table(uint16_t colortable[16], uint16_t fgcolor, - uint16_t bgcolor) { - for (int i = 0; i < 16; i++) { - colortable[i] = interpolate_color(fgcolor, bgcolor, i); - } -} - -uint32_t rgb565_to_rgb888(uint16_t color); - -uint32_t interpolate_rgb888_color(uint32_t color0, uint32_t color1, - uint8_t step); - -#endif //_COLORS_H diff --git a/core/embed/lib/display_draw.c b/core/embed/lib/display_draw.c deleted file mode 100644 index a90f3be3e5..0000000000 --- a/core/embed/lib/display_draw.c +++ /dev/null @@ -1,357 +0,0 @@ -/* - * This file is part of the Trezor project, https://trezor.io/ - * - * Copyright (c) SatoshiLabs - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#define _GNU_SOURCE - -#include - -#include - -#include "buffers.h" -#include "display.h" -#include "display_draw.h" -#include "fonts/fonts.h" -#include "memzero.h" - -#ifdef USE_DMA2D -#include "dma2d.h" -#endif - -static struct { - int x, y; -} DISPLAY_OFFSET; - -// common display functions - -#define CLAMP(x, min, max) (MIN(MAX((x), (min)), (max))) - -static inline void clamp_coords(int x, int y, int w, int h, int *x0, int *y0, - int *x1, int *y1) { - *x0 = CLAMP(x, 0, DISPLAY_RESX); - *y0 = CLAMP(y, 0, DISPLAY_RESY); - *x1 = CLAMP(x + w - 1, -1, DISPLAY_RESX - 1); - *y1 = CLAMP(y + h - 1, -1, DISPLAY_RESY - 1); -} - -void display_clear(void) { -#ifdef DISPLAY_EFFICIENT_CLEAR - display_efficient_clear(); -#else - const int saved_orientation = display_get_orientation(); - - display_reset_state(); - - // set MADCTL first so that we can set the window correctly next - display_orientation(0); - // address the complete frame memory - display_set_window(0, 0, DISPLAY_RESX - 1, DISPLAY_RESY - 1); - for (uint32_t i = 0; i < DISPLAY_RESX * DISPLAY_RESY; i++) { - // 2 bytes per pixel because we're using RGB 5-6-5 format - PIXELDATA(0x0000); - } - // go back to restricted window - display_set_window(0, 0, DISPLAY_RESX - 1, DISPLAY_RESY - 1); - // if valid, go back to the saved orientation - display_orientation(saved_orientation); - // flag display for refresh -#endif - display_pixeldata_dirty(); -} - -void display_bar(int x, int y, int w, int h, uint16_t c) { - x += DISPLAY_OFFSET.x; - y += DISPLAY_OFFSET.y; - int x0 = 0, y0 = 0, x1 = 0, y1 = 0; - clamp_coords(x, y, w, h, &x0, &y0, &x1, &y1); - display_set_window(x0, y0, x1, y1); - for (int i = 0; i < (x1 - x0 + 1) * (y1 - y0 + 1); i++) { - PIXELDATA(c); - } - display_pixeldata_dirty(); -} - -void display_text_render_buffer(const char *text, int textlen, int font, - buffer_text_t *buffer, int text_offset) { - // determine text length if not provided - if (textlen < 0) { - textlen = strlen(text); - } - - int x = 0; - int max_height = font_max_height(font); - int baseline = font_baseline(font); - - // render glyphs - font_glyph_iter_t iter = font_glyph_iter_init(font, (uint8_t *)text, textlen); - const uint8_t *g = NULL; - while (font_next_glyph(&iter, &g)) { - const uint8_t w = g[0]; // width - const uint8_t h = g[1]; // height - const uint8_t adv = g[2]; // advance - const uint8_t bearX = g[3]; // bearingX - const uint8_t bearY = g[4]; // bearingY -#if TREZOR_FONT_BPP == 4 - uint8_t wa = w + (w & 1); -#else - uint8_t wa = w; -#endif - if (wa && h) { - for (int j = 0; j < h; j++) { - for (int i = 0; i < wa; i++) { - const int a = i + j * wa; -#if TREZOR_FONT_BPP == 1 - const uint8_t c = ((g[5 + a / 8] >> (7 - (a % 8) * 1)) & 0x01) * 15; -#elif TREZOR_FONT_BPP == 2 - const uint8_t c = ((g[5 + a / 4] >> (6 - (a % 4) * 2)) & 0x03) * 5; -#elif TREZOR_FONT_BPP == 4 - const uint8_t c = (g[5 + a / 2] >> ((a % 2) * 4)) & 0x0F; -#elif TREZOR_FONT_BPP == 8 -#error Rendering into buffer not supported when using TREZOR_FONT_BPP = 8 - // const uint8_t c = g[5 + a / 1] >> 4; -#else -#error Unsupported TREZOR_FONT_BPP value -#endif - - int x_pos = text_offset + i + x + bearX; - int y_pos = j + max_height - bearY - baseline; - - if (y_pos < 0) continue; - - if (x_pos >= BUFFER_PIXELS || x_pos < 0) { - continue; - } - - int buffer_pos = x_pos + y_pos * BUFFER_PIXELS; - - if (buffer_pos < (sizeof(buffer_text_t) * 2)) { - int b = buffer_pos / 2; - if (buffer_pos % 2) { - buffer->buffer[b] |= c << 4; - } else { - buffer->buffer[b] |= (c); - } - } - } - } - } - x += adv; - } -} - -#ifdef FRAMEBUFFER -static void display_text_render(int x, int y, const char *text, int textlen, - int font, uint16_t fgcolor, uint16_t bgcolor) { - // determine text length if not provided - if (textlen < 0) { - textlen = strlen(text); - } - - int total_adv = 0; - - uint32_t *fb = display_get_fb_addr(); - - uint16_t colortable[16] = {0}; - set_color_table(colortable, fgcolor, bgcolor); - - // render glyphs - font_glyph_iter_t iter = font_glyph_iter_init(font, (uint8_t *)text, textlen); - const uint8_t *g = NULL; - while (font_next_glyph(&iter, &g)) { - const uint8_t w = g[0]; // width - const uint8_t h = g[1]; // height - const uint8_t adv = g[2]; // advance - const uint8_t bearX = g[3]; // bearingX - const uint8_t bearY = g[4]; // bearingY - -#if TREZOR_FONT_BPP == 4 - uint8_t wa = w + (w & 1); -#else - uint8_t wa = w; -#endif - - if (w && h) { - for (int j = 0; j < h; j++) { - for (int i = 0; i < wa; i++) { - const int a = i + j * wa; -#if TREZOR_FONT_BPP == 1 - const uint8_t c = ((g[5 + a / 8] >> (7 - (a % 8) * 1)) & 0x01) * 15; -#elif TREZOR_FONT_BPP == 2 - const uint8_t c = ((g[5 + a / 4] >> (6 - (a % 4) * 2)) & 0x03) * 5; -#elif TREZOR_FONT_BPP == 4 - const uint8_t c = (g[5 + a / 2] >> ((a % 2) * 4)) & 0x0F; -#elif TREZOR_FONT_BPP == 8 -#error Rendering into buffer not supported when using TREZOR_FONT_BPP = 8 - // const uint8_t c = g[5 + a / 1] >> 4; -#else -#error Unsupported TREZOR_FONT_BPP value -#endif - - int x_pos = x + i + total_adv + bearX; - int y_pos = y + j - bearY; - - if (y_pos < 0) continue; - - if (x_pos >= DISPLAY_FRAMEBUFFER_WIDTH || x_pos < 0 || - y_pos >= DISPLAY_FRAMEBUFFER_HEIGHT || y_pos < 0) { - continue; - } - - display_pixel((uint8_t *)fb, x_pos, y_pos, colortable[c]); - } - } - } - total_adv += adv; - } - display_pixeldata_dirty(); -} - -#else -static void display_text_render(int x, int y, const char *text, int textlen, - int font, uint16_t fgcolor, uint16_t bgcolor) { - // determine text length if not provided - if (textlen < 0) { - textlen = strlen(text); - } - - uint16_t colortable[16] = {0}; - set_color_table(colortable, fgcolor, bgcolor); - - // render glyphs - font_glyph_iter_t iter = font_glyph_iter_init(font, (uint8_t *)text, textlen); - const uint8_t *g = NULL; - while (font_next_glyph(&iter, &g)) { - const uint8_t w = g[0]; // width - const uint8_t h = g[1]; // height - const uint8_t adv = g[2]; // advance - const uint8_t bearX = g[3]; // bearingX - const uint8_t bearY = g[4]; // bearingY - -#if TREZOR_FONT_BPP == 4 - uint8_t wa = w + (w & 1); -#else - uint8_t wa = w; -#endif - if (wa && h) { - const int sx = x + bearX; - const int sy = y - bearY; - int x0 = 0, y0 = 0, x1 = 0, y1 = 0; - clamp_coords(sx, sy, w, h, &x0, &y0, &x1, &y1); - display_set_window(x0, y0, x1, y1); - for (int j = y0; j <= y1; j++) { - for (int i = x0; i <= x1; i++) { - const int rx = i - sx; - const int ry = j - sy; - const int a = rx + ry * wa; -#if TREZOR_FONT_BPP == 1 - const uint8_t c = ((g[5 + a / 8] >> (7 - (a % 8) * 1)) & 0x01) * 15; -#elif TREZOR_FONT_BPP == 2 - const uint8_t c = ((g[5 + a / 4] >> (6 - (a % 4) * 2)) & 0x03) * 5; -#elif TREZOR_FONT_BPP == 4 - const uint8_t c = (g[5 + a / 2] >> ((a % 2) * 4)) & 0x0F; -#elif TREZOR_FONT_BPP == 8 - const uint8_t c = g[5 + a / 1] >> 4; -#else -#error Unsupported TREZOR_FONT_BPP value -#endif - PIXELDATA(colortable[c]); - } - } - } - x += adv; - } - display_pixeldata_dirty(); -} -#endif - -void display_text(int x, int y, const char *text, int textlen, int font, - uint16_t fgcolor, uint16_t bgcolor) { - x += DISPLAY_OFFSET.x; - y += DISPLAY_OFFSET.y; - display_text_render(x, y, text, textlen, font, fgcolor, bgcolor); -} - -void display_text_center(int x, int y, const char *text, int textlen, int font, - uint16_t fgcolor, uint16_t bgcolor) { - x += DISPLAY_OFFSET.x; - y += DISPLAY_OFFSET.y; - int w = font_text_width(font, text, textlen); - display_text_render(x - w / 2, y, text, textlen, font, fgcolor, bgcolor); -} - -void display_text_right(int x, int y, const char *text, int textlen, int font, - uint16_t fgcolor, uint16_t bgcolor) { - x += DISPLAY_OFFSET.x; - y += DISPLAY_OFFSET.y; - int w = font_text_width(font, text, textlen); - display_text_render(x - w, y, text, textlen, font, fgcolor, bgcolor); -} - -#ifdef TREZOR_PRODTEST - -#include "qr-code-generator/qrcodegen.h" -#define QR_MAX_VERSION 9 - -void display_qrcode(int x, int y, const char *data, uint8_t scale) { - if (scale < 1 || scale > 10) return; - - uint8_t codedata[qrcodegen_BUFFER_LEN_FOR_VERSION(QR_MAX_VERSION)] = {0}; - uint8_t tempdata[qrcodegen_BUFFER_LEN_FOR_VERSION(QR_MAX_VERSION)] = {0}; - - int side = 0; - if (qrcodegen_encodeText(data, tempdata, codedata, qrcodegen_Ecc_MEDIUM, - qrcodegen_VERSION_MIN, QR_MAX_VERSION, - qrcodegen_Mask_AUTO, true)) { - side = qrcodegen_getSize(codedata); - } - - x += DISPLAY_OFFSET.x - (side + 2) * scale / 2; - y += DISPLAY_OFFSET.y - (side + 2) * scale / 2; - int x0 = 0, y0 = 0, x1 = 0, y1 = 0; - clamp_coords(x, y, (side + 2) * scale, (side + 2) * scale, &x0, &y0, &x1, - &y1); - display_set_window(x0, y0, x1, y1); - for (int j = y0; j <= y1; j++) { - for (int i = x0; i <= x1; i++) { - int rx = (i - x) / scale - 1; - int ry = (j - y) / scale - 1; - // 1px border - if (rx < 0 || ry < 0 || rx >= side || ry >= side) { - PIXELDATA(0xFFFF); - continue; - } - if (qrcodegen_getModule(codedata, rx, ry)) { - PIXELDATA(0x0000); - } else { - PIXELDATA(0xFFFF); - } - } - } - display_pixeldata_dirty(); -} - -#endif - -void display_offset(int set_xy[2], int *get_x, int *get_y) { - if (set_xy) { - DISPLAY_OFFSET.x = set_xy[0]; - DISPLAY_OFFSET.y = set_xy[1]; - } - *get_x = DISPLAY_OFFSET.x; - *get_y = DISPLAY_OFFSET.y; -} diff --git a/core/embed/lib/display_draw.h b/core/embed/lib/display_draw.h deleted file mode 100644 index 0facb5db14..0000000000 --- a/core/embed/lib/display_draw.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * This file is part of the Trezor project, https://trezor.io/ - * - * Copyright (c) SatoshiLabs - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef __DISPLAY_DRAW_H__ -#define __DISPLAY_DRAW_H__ - -#include - -#include "buffers.h" -#include "colors.h" -#include "fonts/fonts.h" - -// provided by common - -void display_clear(void); - -void display_bar(int x, int y, int w, int h, uint16_t c); - -void display_text(int x, int y, const char *text, int textlen, int font, - uint16_t fgcolor, uint16_t bgcolor); -void display_text_center(int x, int y, const char *text, int textlen, int font, - uint16_t fgcolor, uint16_t bgcolor); -void display_text_right(int x, int y, const char *text, int textlen, int font, - uint16_t fgcolor, uint16_t bgcolor); -void display_text_render_buffer(const char *text, int textlen, int font, - buffer_text_t *buffer, int text_offset); - -void display_qrcode(int x, int y, const char *data, uint8_t scale); - -void display_offset(int set_xy[2], int *get_x, int *get_y); - -#endif diff --git a/core/embed/lib/display_utils.c b/core/embed/lib/display_utils.c index 8fb4d12634..ea803aa610 100644 --- a/core/embed/lib/display_utils.c +++ b/core/embed/lib/display_utils.c @@ -25,9 +25,9 @@ void display_fade(int start, int end, int delay) { #ifdef USE_BACKLIGHT for (int i = 0; i < 100; i++) { - display_backlight(start + i * (end - start) / 100); + display_set_backlight(start + i * (end - start) / 100); hal_delay(delay / 100); } - display_backlight(end); + display_set_backlight(end); #endif } diff --git a/core/embed/lib/dma2d_emul.c b/core/embed/lib/dma2d_emul.c deleted file mode 100644 index 99fb880be0..0000000000 --- a/core/embed/lib/dma2d_emul.c +++ /dev/null @@ -1,144 +0,0 @@ -/* - * This file is part of the Trezor project, https://trezor.io/ - * - * Copyright (c) SatoshiLabs - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "colors.h" -#include "display.h" - -typedef enum { - DMA2D_LAYER_FG = 1, - DMA2D_LAYER_BG = 0, -} dma2d_layer_t; - -typedef enum { - DMA2D_MODE_CONST = 0, - DMA2D_MODE_4BPP, - DMA2D_MODE_16BPP, - DMA2D_MODE_4BPP_OVER_4BPP, - DMA2D_MODE_4BPP_OVER_16BPP, -} dma2d_mode_t; - -static uint16_t clut_bg[16]; -static uint16_t clut_fg[16]; -static uint16_t dma2d_color; -static dma2d_mode_t mode = 0; - -void dma2d_init(void) { - // do nothing -} - -void dma2d_init_clut(uint16_t fg, uint16_t bg, dma2d_layer_t layer) { - uint16_t* table; - if (layer == DMA2D_LAYER_BG) { - table = clut_bg; - } else { - table = clut_fg; - } - - set_color_table(table, fg, bg); -} - -void dma2d_setup_const(void) { mode = DMA2D_MODE_CONST; } - -void dma2d_setup_4bpp(uint16_t fg_color, uint16_t bg_color) { - dma2d_init_clut(fg_color, bg_color, DMA2D_LAYER_FG); - mode = DMA2D_MODE_4BPP; -} - -void dma2d_setup_16bpp(void) { mode = DMA2D_MODE_16BPP; } - -void dma2d_setup_4bpp_over_16bpp(uint16_t overlay_color) { - mode = DMA2D_MODE_4BPP_OVER_16BPP; - dma2d_color = overlay_color; -} - -void dma2d_setup_4bpp_over_4bpp(uint16_t fg_color, uint16_t bg_color, - uint16_t overlay_color) { - mode = DMA2D_MODE_4BPP_OVER_4BPP; - - dma2d_color = overlay_color; - dma2d_init_clut(fg_color, bg_color, DMA2D_LAYER_BG); -} - -void dma2d_start(uint8_t* in_addr, uint8_t* out_addr, int32_t pixels) { - (void)out_addr; - for (int i = 0; i < pixels; i++) { - if (mode == DMA2D_MODE_4BPP) { - uint8_t c = ((uint8_t*)in_addr)[i / 2]; - uint8_t even_pix = c >> 4; - uint8_t odd_pix = c & 0xF; - PIXELDATA(clut_fg[odd_pix]); - PIXELDATA(clut_fg[even_pix]); - i++; // wrote two pixels - } - if (mode == DMA2D_MODE_16BPP) { - uint16_t c = ((uint16_t*)in_addr)[i]; - PIXELDATA(c); - } - } -} - -void dma2d_start_const(uint16_t color, uint8_t* out_addr, int32_t pixels) { - (void)out_addr; - for (int i = 0; i < pixels; i++) { - PIXELDATA(color); - } -} - -void dma2d_start_blend(uint8_t* overlay_addr, uint8_t* bg_addr, - uint8_t* out_addr, int32_t pixels) { - (void)out_addr; - for (int i = 0; i < pixels; i++) { - if (mode == DMA2D_MODE_4BPP_OVER_4BPP) { - uint8_t c = overlay_addr[i / 2]; - uint8_t b = bg_addr[i / 2]; - - uint8_t odd_overlay_pix = c & 0xF; - uint8_t odd_bg_pix = b & 0xF; - uint16_t c_odd_bg = clut_bg[odd_bg_pix]; - uint16_t final_odd_color = - interpolate_color(dma2d_color, c_odd_bg, odd_overlay_pix); - PIXELDATA(final_odd_color); - - uint8_t even_overlay_pix = c >> 4; - uint8_t even_bg_pix = b >> 4; - uint16_t c_even_bg = clut_bg[even_bg_pix]; - uint16_t final_even_color = - interpolate_color(dma2d_color, c_even_bg, even_overlay_pix); - PIXELDATA(final_even_color); - - i++; // wrote two pixels - } - if (mode == DMA2D_MODE_4BPP_OVER_16BPP) { - uint16_t c = ((uint16_t*)bg_addr)[i]; - uint8_t o = overlay_addr[i / 2]; - uint8_t o_pix; - if (i % 2 == 0) { - o_pix = o & 0xF; - } else { - o_pix = o >> 4; - } - uint16_t final_odd_color = interpolate_color(dma2d_color, c, o_pix); - PIXELDATA(final_odd_color); - } - } -} - -void dma2d_wait_for_transfer(void) { - // done in place when emulating, so no need for wait here -} diff --git a/core/embed/lib/gfx_color.c b/core/embed/lib/gfx_color.c index 429446e2ae..bf5716c5a1 100644 --- a/core/embed/lib/gfx_color.c +++ b/core/embed/lib/gfx_color.c @@ -18,7 +18,6 @@ */ #include "gfx_color.h" -#include "colors.h" const gfx_color16_t* gfx_color16_gradient_a4(gfx_color_t fg_color, gfx_color_t bg_color) { diff --git a/core/embed/lib/gfx_color.h b/core/embed/lib/gfx_color.h index c67998ae41..4b0a10f7b3 100644 --- a/core/embed/lib/gfx_color.h +++ b/core/embed/lib/gfx_color.h @@ -54,6 +54,9 @@ typedef uint32_t gfx_color32_t; #define gfx_color_to_color32(c) (gfx_color16_to_color32(c)) #define gfx_color32_to_color(c) (gfx_color32_to_color16(c)) #define gfx_color_lum(c) (gfx_color16_lum(c)) +#define gfx_color_rgb(r, g, b) gfx_color16_rgb(r, g, b) +#define COLOR_WHITE 0xFFFF +#define COLOR_BLACK 0x0000 #elif defined GFX_COLOR_32BIT #define gfx_color_t gfx_color32_t #define gfx_color_to_color16(c) (gfx_color32_to_color16(c)) @@ -61,6 +64,9 @@ typedef uint32_t gfx_color32_t; #define gfx_color_to_color32(c) (c) #define gfx_color32_to_color(c) (c) #define gfx_color_lum(c) (gfx_color32_lum(c)) +#define gfx_color_rgb(r, g, b) gfx_color32_rgb(r, g, b) +#define COLOR_WHITE 0xFFFFFFFF +#define COLOR_BLACK 0xFF000000 #else #error "GFX_COLOR_16BIT/32BIT not specified" #endif diff --git a/core/embed/lib/gfx_draw.c b/core/embed/lib/gfx_draw.c index ef73105854..f180b791c7 100644 --- a/core/embed/lib/gfx_draw.c +++ b/core/embed/lib/gfx_draw.c @@ -17,10 +17,10 @@ * along with this program. If not, see . */ +#include #include #include "display.h" -#include "display_draw.h" #include "fonts/fonts.h" #include "gfx_draw.h" @@ -200,11 +200,16 @@ void gfx_draw_bitmap(gfx_rect_t rect, const gfx_bitmap_t* bitmap) { #define GLYPH_DATA(g) ((void*)&(g)[5]) void gfx_draw_text(gfx_offset_t pos, const char* text, size_t maxlen, - const gfx_text_attr_t* attr) { + const gfx_text_attr_t* attr, gfx_text_align_t align) { if (text == NULL) { return; } + if (align == GFX_ALIGN_CENTER) { + int w = font_text_width(attr->font, text, maxlen); + pos = gfx_offset(pos.x - w / 2, pos.y); + } + gfx_bitmap_t bitmap = { .format = GLYPH_FORMAT, .fg_color = attr->fg_color, @@ -247,9 +252,12 @@ void gfx_draw_text(gfx_offset_t pos, const char* text, size_t maxlen, #include "qr-code-generator/qrcodegen.h" #define QR_MAX_VERSION 9 -void gfx_draw_qrcode(int x, int y, uint8_t scale, const char* data) { +void gfx_draw_qrcode(gfx_offset_t offset, uint8_t scale, const char* data) { if (scale < 1 || scale > 10) return; + int x = offset.x; + int y = offset.y; + uint8_t codedata[qrcodegen_BUFFER_LEN_FOR_VERSION(QR_MAX_VERSION)] = {0}; uint8_t tempdata[qrcodegen_BUFFER_LEN_FOR_VERSION(QR_MAX_VERSION)] = {0}; @@ -288,43 +296,3 @@ void gfx_draw_qrcode(int x, int y, uint8_t scale, const char* data) { } #endif // TREZOR_PRODTEST - -// =============================================================== -// emulation of legacy functions - -void display_clear(void) { gfx_clear(); } - -void display_bar(int x, int y, int w, int h, uint16_t c) { - gfx_draw_bar(gfx_rect_wh(x, y, w, h), gfx_color16_to_color(c)); -} - -void display_text(int x, int y, const char* text, int textlen, int font, - uint16_t fg_color, uint16_t bg_color) { - gfx_text_attr_t attr = { - .font = font, - .fg_color = gfx_color16_to_color(fg_color), - .bg_color = gfx_color16_to_color(bg_color), - }; - - size_t maxlen = textlen < 0 ? UINT32_MAX : textlen; - gfx_draw_text(gfx_offset(x, y), text, maxlen, &attr); -} - -void display_text_center(int x, int y, const char* text, int textlen, int font, - uint16_t fg_color, uint16_t bg_color) { - gfx_text_attr_t attr = { - .font = font, - .fg_color = gfx_color16_to_color(fg_color), - .bg_color = gfx_color16_to_color(bg_color), - }; - - size_t maxlen = textlen < 0 ? UINT32_MAX : textlen; - int w = font_text_width(font, text, textlen); - gfx_draw_text(gfx_offset(x - w / 2, y), text, maxlen, &attr); -} - -#ifdef TREZOR_PRODTEST -void display_qrcode(int x, int y, const char* data, uint8_t scale) { - gfx_draw_qrcode(x, y, scale, data); -} -#endif // TREZOR_PRODTEST diff --git a/core/embed/lib/gfx_draw.h b/core/embed/lib/gfx_draw.h index 280c13abdb..01f750a223 100644 --- a/core/embed/lib/gfx_draw.h +++ b/core/embed/lib/gfx_draw.h @@ -128,6 +128,9 @@ typedef struct { gfx_color_t bg_color; } gfx_text_attr_t; +// Clears the display with a black color. +void gfx_clear(void); + // Fills a rectangle with a specified color. void gfx_draw_bar(gfx_rect_t rect, gfx_color_t color); @@ -141,14 +144,22 @@ void gfx_draw_bar(gfx_rect_t rect, gfx_color_t color); // Not all bitmap formats are supported now. Please see the implementation. void gfx_draw_bitmap(gfx_rect_t rect, const gfx_bitmap_t* bitmap); +// Horizontal alignment of a text +typedef enum { + GFX_ALIGN_LEFT, + GFX_ALIGN_CENTER, +} gfx_text_align_t; + // Draws a text to the specified position. // // `offset` - the most left point on the font baseline // `text` - utf-8 text // `maxlen` - maximum number of characters displayed (use SIZE_MAX when not -// specified) `attr` - font & text color +// specified) +// `attr` - font & text color +// `align` - horizontal alignment void gfx_draw_text(gfx_offset_t offset, const char* text, size_t maxlen, - const gfx_text_attr_t* attr); + const gfx_text_attr_t* attr, gfx_text_align_t align); #ifdef TREZOR_PRODTEST // Draws a QR code to the specified position. @@ -156,7 +167,7 @@ void gfx_draw_text(gfx_offset_t offset, const char* text, size_t maxlen, // `x`, `y` - center of the QR code // `scale` - size of a single QR code module // `data` - utf-8 text -void gfx_draw_qrcode(int x, int y, uint8_t scale, const char* data); +void gfx_draw_qrcode(gfx_offset_t offset, uint8_t scale, const char* data); #endif #endif // GFX_DRAW_H diff --git a/core/embed/lib/rsod.c b/core/embed/lib/rsod.c index 0b9a97611a..87be6aea73 100644 --- a/core/embed/lib/rsod.c +++ b/core/embed/lib/rsod.c @@ -34,13 +34,13 @@ #define RSOD_FG_COLOR COLOR_WHITE #ifdef USE_RGB_COLORS -#define RSOD_BG_COLOR RGB16(0x7F, 0x00, 0x00) +#define RSOD_BG_COLOR gfx_color_rgb(0x7F, 0x00, 0x00) #else #define RSOD_BG_COLOR COLOR_BLACK #endif void rsod_terminal(const systask_postmortem_t* pminfo) { - display_orientation(0); + display_set_orientation(0); term_set_color(RSOD_FG_COLOR, RSOD_BG_COLOR); const char* title = RSOD_DEFAULT_TITLE; @@ -93,7 +93,7 @@ void rsod_terminal(const systask_postmortem_t* pminfo) { term_printf("\n%s\n", footer); } - display_backlight(255); + display_set_backlight(255); } #endif // KERNEL_MODE diff --git a/core/embed/lib/terminal.c b/core/embed/lib/terminal.c index 79f5f300cb..ac81f84507 100644 --- a/core/embed/lib/terminal.c +++ b/core/embed/lib/terminal.c @@ -30,17 +30,15 @@ #define TERMINAL_ROWS (DISPLAY_RESY / 8) static char terminal_fb[TERMINAL_ROWS][TERMINAL_COLS]; -static uint16_t terminal_fgcolor = COLOR_WHITE; -static uint16_t terminal_bgcolor = COLOR_BLACK; +static gfx_color_t terminal_fgcolor = COLOR_WHITE; +static gfx_color_t terminal_bgcolor = COLOR_BLACK; // set colors for display_print function -void term_set_color(uint16_t fgcolor, uint16_t bgcolor) { +void term_set_color(gfx_color_t fgcolor, gfx_color_t bgcolor) { terminal_fgcolor = fgcolor; terminal_bgcolor = bgcolor; } -#ifdef NEW_RENDERING - // Font_Bitmap contains 96 (0x20 - 0x7F) 5x7 glyphs // Each glyph consists of 5 bytes (each byte represents one column) // @@ -80,8 +78,8 @@ static void term_redraw_rows(int start_row, int row_count) { .src_x = 0, .src_y = 0, .src_stride = 8, - .src_fg = gfx_color16_to_color(terminal_fgcolor), - .src_bg = gfx_color16_to_color(terminal_bgcolor), + .src_fg = terminal_fgcolor, + .src_bg = terminal_bgcolor, }; for (int y = start_row; y < start_row + row_count; y++) { @@ -93,7 +91,6 @@ static void term_redraw_rows(int start_row, int row_count) { } } } -#endif // NEW_RENDERING // display text using bitmap font void term_print(const char *text, int textlen) { @@ -133,39 +130,8 @@ void term_print(const char *text, int textlen) { } } -#ifdef NEW_RENDERING term_redraw_rows(0, TERMINAL_ROWS); display_refresh(); -#else // NEW RENDERING - // render buffer to display - display_set_window(0, 0, DISPLAY_RESX - 1, DISPLAY_RESY - 1); - for (int i = 0; i < DISPLAY_RESX * DISPLAY_RESY; i++) { - int x = (i % DISPLAY_RESX); - int y = (i / DISPLAY_RESX); - const int j = y % 8; - y /= 8; - const int k = x % 6; - x /= 6; - char c = 0; - if (x < TERMINAL_COLS && y < TERMINAL_ROWS) { - c = terminal_fb[y][x] & 0x7F; - // char invert = terminal_fb[y][x] & 0x80; - } else { - c = ' '; - } - if (c < ' ') { - c = ' '; - } - const uint8_t *g = Font_Bitmap + (5 * (c - ' ')); - if (k < 5 && (g[k] & (1 << j))) { - PIXELDATA(gfx_color16_to_color(terminal_fgcolor)); - } else { - PIXELDATA(gfx_color16_to_color(terminal_bgcolor)); - } - } - display_pixeldata_dirty(); - display_refresh(); -#endif } // variadic term_print diff --git a/core/embed/lib/terminal.h b/core/embed/lib/terminal.h index d1dc9bfa01..73d38a938c 100644 --- a/core/embed/lib/terminal.h +++ b/core/embed/lib/terminal.h @@ -20,9 +20,9 @@ #ifndef LIB_TERMINAL_H #define LIB_TERMINAL_H -#include "colors.h" +#include "gfx_color.h" -void term_set_color(uint16_t fgcolor, uint16_t bgcolor); +void term_set_color(gfx_color_t fgcolor, gfx_color_t bgcolor); void term_print(const char *text, int textlen); void term_printf(const char *fmt, ...) __attribute__((__format__(__printf__, 1, 2))); diff --git a/core/embed/prodtest/main.c b/core/embed/prodtest/main.c index 7011d9be7a..f716574a00 100644 --- a/core/embed/prodtest/main.c +++ b/core/embed/prodtest/main.c @@ -29,11 +29,12 @@ #include "bootutils.h" #include "button.h" #include "display.h" -#include "display_draw.h" #include "display_utils.h" #include "flash.h" #include "flash_otp.h" +#include "fonts/fonts.h" #include "fwutils.h" +#include "gfx_draw.h" #include "image.h" #include "mpu.h" #include "prodtest_common.h" @@ -80,12 +81,18 @@ #define MODEL_IDENTIFIER MODEL_INTERNAL_NAME "-" #endif +static gfx_text_attr_t bold = { + .font = FONT_BOLD, + .fg_color = COLOR_WHITE, + .bg_color = COLOR_BLACK, +}; + static secbool startswith(const char *s, const char *prefix) { return sectrue * (0 == strncmp(s, prefix, strlen(prefix))); } static void vcp_intr(void) { - display_clear(); + gfx_clear(); error_shutdown("vcp_intr"); } @@ -193,15 +200,22 @@ void extract_params(const char *str, int *numbers, int *count, int max_count) { static void draw_border(int width, int padding) { const int W = width, P = padding, RX = DISPLAY_RESX, RY = DISPLAY_RESY; - display_clear(); - display_bar(P, P, RX - 2 * P, RY - 2 * P, 0xFFFF); - display_bar(P + W, P + W, RX - 2 * (P + W), RY - 2 * (P + W), 0x0000); + + gfx_clear(); + + gfx_rect_t r_out = gfx_rect_wh(P, P, RX - 2 * P, RY - 2 * P); + gfx_rect_t r_in = + gfx_rect_wh(P + W, P + W, RX - 2 * (P + W), RY - 2 * (P + W)); + + gfx_draw_bar(r_out, COLOR_WHITE); + gfx_draw_bar(r_in, COLOR_BLACK); + display_refresh(); } static void draw_welcome_screen(void) { #if defined TREZOR_MODEL_R || defined TREZOR_MODEL_T3B1 - display_bar(0, 0, DISPLAY_RESX, DISPLAY_RESY, 0xFFFF); + gfx_draw_bar(gfx_rect_wh(0, 0, DISPLAY_RESX, DISPLAY_RESY), COLOR_WHITE); display_refresh(); #else draw_border(1, 3); @@ -214,28 +228,30 @@ static void test_border(void) { } static void test_display(const char *colors) { - display_clear(); + gfx_clear(); size_t l = strlen(colors); size_t w = DISPLAY_RESX / l; for (size_t i = 0; i < l; i++) { - uint16_t c = 0x0000; // black + uint16_t c = COLOR_BLACK; // black switch (colors[i]) { case 'R': - c = 0xF800; + c = gfx_color_rgb(255, 0, 0); break; case 'G': - c = 0x07E0; + c = gfx_color_rgb(0, 255, 0); break; case 'B': - c = 0x001F; + c = gfx_color_rgb(0, 0, 255); break; case 'W': - c = 0xFFFF; + c = COLOR_WHITE; break; } - display_bar(i * w, 0, i * w + w, DISPLAY_RESY, c); + + gfx_rect_t r = gfx_rect_wh(i * w, 0, i * w + w, DISPLAY_RESY); + gfx_draw_bar(r, c); } display_refresh(); vcp_println("OK"); @@ -365,19 +381,19 @@ static void test_touch(const char *args) { const int width = DISPLAY_RESX / 2; const int height = DISPLAY_RESY / 2; - display_clear(); + gfx_clear(); switch (column) { case 1: - display_bar(0, 0, width, height, 0xFFFF); + gfx_draw_bar(gfx_rect_wh(0, 0, width, height), COLOR_WHITE); break; case 2: - display_bar(width, 0, width, height, 0xFFFF); + gfx_draw_bar(gfx_rect_wh(width, 0, width, height), COLOR_WHITE); break; case 3: - display_bar(width, height, width, height, 0xFFFF); + gfx_draw_bar(gfx_rect_wh(width, height, width, height), COLOR_WHITE); break; default: - display_bar(0, height, width, height, 0xFFFF); + gfx_draw_bar(gfx_rect_wh(0, height, width, height), COLOR_WHITE); break; } display_refresh(); @@ -392,7 +408,7 @@ static void test_touch(const char *args) { } else { vcp_println("ERROR TIMEOUT"); } - display_clear(); + gfx_clear(); display_refresh(); touch_deinit(); @@ -421,8 +437,8 @@ static void test_touch_custom(const char *args) { uint32_t ticks_start = hal_ticks_ms(); - display_clear(); - display_bar(x, y, width, height, 0xFFFF); + gfx_clear(); + gfx_draw_bar(gfx_rect_wh(x, y, width, height), COLOR_WHITE); display_refresh(); touch_init(); @@ -452,7 +468,7 @@ static void test_touch_custom(const char *args) { } } - display_clear(); + gfx_clear(); display_refresh(); touch_deinit(); @@ -475,9 +491,9 @@ static void test_touch_idle(const char *args) { uint32_t ticks_start = hal_ticks_ms(); - display_clear(); - display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY / 2, "DON'T TOUCH", -1, - FONT_BOLD, COLOR_WHITE, COLOR_BLACK); + gfx_clear(); + gfx_offset_t pos = gfx_offset(DISPLAY_RESX / 2, DISPLAY_RESY / 2); + gfx_draw_text(pos, "DON'T TOUCH", -1, &bold, GFX_ALIGN_CENTER); display_refresh(); touch_init(); @@ -494,7 +510,7 @@ static void test_touch_idle(const char *args) { } } - display_clear(); + gfx_clear(); display_refresh(); touch_deinit(); @@ -515,9 +531,9 @@ static void test_touch_power(const char *args) { int timeout = params[0]; - display_clear(); - display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY / 2, "MEASURING", -1, - FONT_BOLD, COLOR_WHITE, COLOR_BLACK); + gfx_clear(); + gfx_offset_t pos = gfx_offset(DISPLAY_RESX / 2, DISPLAY_RESY / 2); + gfx_draw_text(pos, "MEASURING", -1, &bold, GFX_ALIGN_CENTER); display_refresh(); touch_power_set(true); @@ -528,7 +544,7 @@ static void test_touch_power(const char *args) { touch_power_set(false); - display_clear(); + gfx_clear(); display_refresh(); } @@ -538,7 +554,7 @@ static void test_sensitivity(const char *args) { touch_init(); touch_set_sensitivity(v & 0xFF); - display_clear(); + gfx_clear(); display_refresh(); for (;;) { @@ -546,11 +562,11 @@ static void test_sensitivity(const char *args) { if (evt & TOUCH_START || evt & TOUCH_MOVE) { int x = touch_unpack_x(evt); int y = touch_unpack_y(evt); - display_clear(); - display_bar(x - 48, y - 48, 96, 96, 0xFFFF); + gfx_clear(); + gfx_draw_bar(gfx_rect_wh(x - 48, y - 48, 96, 96), COLOR_WHITE); display_refresh(); } else if (evt & TOUCH_END) { - display_clear(); + gfx_clear(); display_refresh(); } } @@ -569,7 +585,7 @@ static void touch_version(void) { static void test_pwm(const char *args) { int v = atoi(args); - display_backlight(v); + display_set_backlight(v); display_refresh(); vcp_println("OK"); } @@ -662,9 +678,9 @@ static void test_boardloader_version(const boardloader_version_t *version) { static void test_wipe(void) { firmware_invalidate_header(); - display_clear(); - display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY / 2 + 10, "WIPED", -1, - FONT_BOLD, COLOR_WHITE, COLOR_BLACK); + gfx_clear(); + gfx_offset_t pos = gfx_offset(DISPLAY_RESX / 2, DISPLAY_RESY / 2 + 10); + gfx_draw_text(pos, "WIPED", -1, &bold, GFX_ALIGN_CENTER); display_refresh(); vcp_println("OK"); } @@ -858,16 +874,21 @@ int main(void) { pair_optiga(); #endif - display_clear(); + gfx_clear(); draw_welcome_screen(); char dom[32]; // format: {MODEL_IDENTIFIER}-YYMMDD if (sectrue == flash_otp_read(FLASH_OTP_BLOCK_BATCH, 0, (uint8_t *)dom, 32) && sectrue == startswith(dom, MODEL_IDENTIFIER) && dom[31] == 0) { - display_qrcode(DISPLAY_RESX / 2, DISPLAY_RESY / 2, dom, 4); - display_text_center(DISPLAY_RESX / 2, DISPLAY_RESY - 30, dom + 8, -1, - FONT_BOLD, COLOR_WHITE, COLOR_BLACK); + gfx_offset_t pos; + + pos = gfx_offset(DISPLAY_RESX / 2, DISPLAY_RESY / 2); + gfx_draw_qrcode(pos, 4, dom); + + pos = gfx_offset(DISPLAY_RESX / 2, DISPLAY_RESY - 30); + gfx_draw_text(pos, dom + 8, -1, &bold, GFX_ALIGN_CENTER); + display_refresh(); } diff --git a/core/embed/reflash/main.c b/core/embed/reflash/main.c index 851834df9b..b987687331 100644 --- a/core/embed/reflash/main.c +++ b/core/embed/reflash/main.c @@ -22,8 +22,8 @@ #include "bootutils.h" #include "display.h" -#include "display_draw.h" #include "flash.h" +#include "gfx_draw.h" #include "image.h" #include "rng.h" #include "rsod.h" @@ -76,7 +76,7 @@ int main(void) { #endif display_orientation(0); - display_clear(); + gfx_clear(); display_backlight(255); ensure(sdcard_is_present(), "sdcard_is_present"); diff --git a/core/embed/rust/Cargo.toml b/core/embed/rust/Cargo.toml index 77091f4326..591063acbc 100644 --- a/core/embed/rust/Cargo.toml +++ b/core/embed/rust/Cargo.toml @@ -19,8 +19,6 @@ xframebuffer = [] display_mono = [] display_rgb565 = ["ui_antialiasing"] display_rgba8888 = ["ui_antialiasing"] -framebuffer = [] -framebuffer32bit = [] ui_debug = [] ui_antialiasing = [] ui_blurring = [] @@ -29,14 +27,11 @@ ui_image_buffer = [] ui_color_32bit = [] ui_overlay = [] ui_empty_lock = [] -new_rendering = [] bootloader = [] button = [] touch = [] clippy = [] jpeg = [] -disp_i8080_8bit_dw = [] # write pixels directly to peripheral -disp_i8080_16bit_dw = [] # write pixels directly to peripheral debug = ["ui_debug"] sbu = [] haptic = [] @@ -55,7 +50,6 @@ test = [ "debug", "glob", "micropython", - "new_rendering", "optiga", "protobuf", "touch", diff --git a/core/embed/rust/build.rs b/core/embed/rust/build.rs index 71955710c2..512e13b395 100644 --- a/core/embed/rust/build.rs +++ b/core/embed/rust/build.rs @@ -143,11 +143,6 @@ fn prepare_bindings() -> bindgen::Builder { bindings = bindings.clang_args(&["-DXFRAMEBUFFER"]); } - #[cfg(feature = "new_rendering")] - { - bindings = bindings.clang_args(["-DNEW_RENDERING"]); - } - clang_args.push(&build_dir_include); // Pass in correct include paths and defines. @@ -398,40 +393,6 @@ fn generate_trezorhal_bindings() { .allowlist_function("systick_ms") // toif .allowlist_type("toif_format_t") - // dma2d - .allowlist_function("dma2d_setup_const") - .allowlist_function("dma2d_setup_4bpp") - .allowlist_function("dma2d_setup_16bpp") - .allowlist_function("dma2d_setup_4bpp_over_4bpp") - .allowlist_function("dma2d_setup_4bpp_over_16bpp") - .allowlist_function("dma2d_start") - .allowlist_function("dma2d_start_blend") - .allowlist_function("dma2d_start_const") - .allowlist_function("dma2d_start_const_multiline") - .allowlist_function("dma2d_wait_for_transfer") - //buffers - .allowlist_function("buffers_get_line_16bpp") - .allowlist_function("buffers_free_line_16bpp") - .allowlist_function("buffers_get_line_4bpp") - .allowlist_function("buffers_free_line_4bpp") - .allowlist_function("buffers_get_text") - .allowlist_function("buffers_free_text") - .allowlist_function("buffers_get_jpeg") - .allowlist_function("buffers_free_jpeg") - .allowlist_function("buffers_get_jpeg_work") - .allowlist_function("buffers_free_jpeg_work") - .allowlist_function("buffers_get_blurring") - .allowlist_function("buffers_free_blurring") - .allowlist_function("buffers_get_blurring_totals") - .allowlist_function("buffers_free_blurring_totals") - .allowlist_var("TEXT_BUFFER_HEIGHT") - .no_copy("buffer_line_16bpp_t") - .no_copy("buffer_line_4bpp_t") - .no_copy("buffer_text_t") - .no_copy("buffer_jpeg_t") - .no_copy("buffer_jpeg_work_t") - .no_copy("buffer_blurring_t") - .no_copy("buffer_blurring_totals_t") //usb .allowlist_function("usb_configured") // touch diff --git a/core/embed/trezorhal/display.h b/core/embed/trezorhal/display.h index 98afdf4fbc..d93751336c 100644 --- a/core/embed/trezorhal/display.h +++ b/core/embed/trezorhal/display.h @@ -17,88 +17,149 @@ * along with this program. If not, see . */ -#ifndef TREZORHAL_DISPLAY_H -#define TREZORHAL_DISPLAY_H +#ifndef TREZORHAL_XDISPLAY_H +#define TREZORHAL_XDISPLAY_H -#if NEW_RENDERING -#include -#else - -#include #include -#ifdef DISPLAY_LEGACY_HEADER -#include DISPLAY_LEGACY_HEADER -#endif +#include "gfx_bitblt.h" -#ifndef DISPLAY_FRAMEBUFFER_OFFSET_Y -#define DISPLAY_FRAMEBUFFER_OFFSET_Y 0 -#endif +// This is a universal API for controlling different types of display +// controllers. +// +// Currently, following displays displays are supported +// +// VG-2864KSWEG01 - OLED Mono / 128x64 pixels / SPI +// - Model T2B1 +// +// UG-2828SWIG01 - OLED Mono / 128x128 pixels / Parallel +// - Early revisions of T2B1 +// +// ST7789V - TFT RGB / 240x240 pixels / Parallel +// - Model T2T1 / Model T3T1 +// +// ILI9341 - TFT RGB / 320x240 pixels / Parallel / LTDC + SPI +// - STM32F429I-DISC1 Discovery Board +// +// MIPI - +// - STM32U5A9J-DK Discovery Board -#ifndef DISPLAY_FRAMEBUFFER_OFFSET_X -#define DISPLAY_FRAMEBUFFER_OFFSET_X 0 -#endif - -#ifndef DISPLAY_FRAMEBUFFER_WIDTH -#define DISPLAY_FRAMEBUFFER_WIDTH 0 -#endif - -#ifndef DISPLAY_FRAMEBUFFER_HEIGHT -#define DISPLAY_FRAMEBUFFER_HEIGHT 0 -#endif - -#ifndef PIXELDATA -#define PIXELDATA(c) display_pixeldata(c) -#endif - -void display_pixeldata(uint16_t c); -void display_pixeldata_dirty(void); - -void display_reset_state(); - -void display_set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); -int display_orientation(int degrees); -int display_get_orientation(void); -int display_backlight(int val); - -void display_init_all(void); -void display_reinit(void); -void display_sync(void); -void display_refresh(void); -void display_finish_actions(void); -const char *display_save(const char *prefix); -void display_clear_save(void); - -void display_efficient_clear(void); -uint32_t *display_get_fb_addr(void); -uint8_t *display_get_wr_addr(void); -void display_shift_window(uint16_t pixels); -uint16_t display_get_window_offset(void); +#ifdef KERNEL_MODE +// Specifies how display content should be handled during +// initialization or deinitialization. typedef enum { // Clear the display content DISPLAY_RESET_CONTENT, - // Keeps the display without any changes + // Retain the display content DISPLAY_RETAIN_CONTENT } display_content_mode_t; -static inline void display_init(display_content_mode_t mode) { - if (mode == DISPLAY_RESET_CONTENT) { - display_init_all(); - } else { - display_reinit(); - } -} +// Initializes the display controller. +// +// If `mode` is `DISPLAY_RETAIN_CONTENT`, ensure the driver was previously +// initialized and `display_deinit(DISPLAY_RETAIN_CONTENT)` was called. +void display_init(display_content_mode_t mode); -static inline void display_deinit(display_content_mode_t mode) { +// Deinitializes the display controller. +// +// If `mode` is `DISPLAY_RETAIN_CONTENT`, the function waits for +// background operations to complete and disables interrupts, so the +// application can safely proceed to the next boot stage and call +// `display_init(DISPLAY_RETAIN_CONTENT)`. +void display_deinit(display_content_mode_t mode); -#ifdef TREZOR_MODEL_T - if (mode == DISPLAY_RESET_CONTENT) { - display_orientation(0); - } +// Allows unprivileged access to the display framebuffer from +// perspective of the GTZC (Global TrustZone Controller). +void display_set_unpriv_access(bool unpriv); + +#endif // KERNEL_MODE + +// Sets display backlight level ranging from 0 (off)..255 (maximum). +// +// The default backligt level is 0. Without settings it +// to some higher value the displayed pixels are not visible. +// Beware that his also applies to the emulator. +// +// Returns the set level (usually the same value or the +// closest value to the `level` argument) +int display_set_backlight(int level); + +// Gets current display level ranging from 0 (off)..255 (maximum). +int display_get_backlight(void); + +// Sets the display orientation. +// +// May accept one of following values: 0, 90, 180, 270 +// but accepted values are model-dependent. +// Default display orientation is always 0. +// +// Returns the set orientation +int display_set_orientation(int angle); + +// Gets the display's current orientation +// +// Returned value is one of 0, 90, 180, 270. +int display_get_orientation(void); + +#ifdef XFRAMEBUFFER + +typedef struct { + // Pointer to the top-left pixel + void *ptr; + // Stride in bytes + size_t stride; + +} display_fb_info_t; + +// Provides pointer to the inactive (writeable) framebuffer. +// +// If framebuffer is not available yet due to display refreshing etc., +// the function may block until the buffer is ready to write. +// +// Return `false` if the framebuffer is not available. +bool display_get_frame_buffer(display_fb_info_t *fb); + +#else // XFRAMEBUFFER + +// Waits for the vertical synchronization pulse. +// +// Used for synchronization with the display refresh cycle +// to achieve tearless UX if possible when not using a frame buffer. +void display_wait_for_sync(void); #endif - display_finish_actions(); -} -#endif // NEW_RENDERING -#endif // TREZORHAL_DISPLAY_H +// Swaps the frame buffers +// +// The function waits for vertical synchronization and +// swaps the active (currently displayed) and the inactive frame buffers. +void display_refresh(void); + +// Following functions define display's bitblt interface. +// +// These functions draw directly to to display or to the +// currently inactive framebuffer. +// +// bb->dst_row and bb->dst_stride must be 0 + +// Fills a rectangle with a solid color. +// This function is supported by all types of displays. +void display_fill(const gfx_bitblt_t *bb); +// Copies an RGB565 bitmap. +// This function is supported by RGB displays only. +void display_copy_rgb565(const gfx_bitblt_t *bb); +// Copies a MONO4 bitmap (supported only with RGB displays). +// This function is supported by RGB displays only. +void display_copy_mono4(const gfx_bitblt_t *bb); +// Copies a MONO1P bitmap. +// This function is supported by all types of displays. +void display_copy_mono1p(const gfx_bitblt_t *bb); + +#ifdef TREZOR_EMULATOR +// Save the screen content to a file. +// The function is available only on the emulator. +const char *display_save(const char *prefix); +void display_clear_save(void); +#endif + +#endif // TREZORHAL_XDISPLAY_H diff --git a/core/embed/trezorhal/dma2d.h b/core/embed/trezorhal/dma2d.h deleted file mode 100644 index 642e9e9ec4..0000000000 --- a/core/embed/trezorhal/dma2d.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This file is part of the Trezor project, https://trezor.io/ - * - * Copyright (c) SatoshiLabs - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef TREZORHAL_DMA2D_H -#define TREZORHAL_DMA2D_H - -#include - -void dma2d_init(void); - -void dma2d_setup_const(void); -void dma2d_setup_4bpp(uint16_t fg_color, uint16_t bg_color); -void dma2d_setup_16bpp(void); -void dma2d_setup_4bpp_over_4bpp(uint16_t fg_color, uint16_t bg_color, - uint16_t overlay_color); -void dma2d_setup_4bpp_over_16bpp(uint16_t overlay_color); - -void dma2d_start(uint8_t* in_addr, uint8_t* out_addr, int32_t pixels); -void dma2d_start_const(uint16_t color, uint8_t* out_addr, int32_t pixels); -void dma2d_start_const_multiline(uint16_t color, uint8_t* out_addr, - int32_t width, int32_t height); -void dma2d_start_blend(uint8_t* overlay_addr, uint8_t* bg_addr, - uint8_t* out_addr, int32_t pixels); - -void dma2d_wait_for_transfer(void); - -#endif // TREZORHAL_DMA2D_H diff --git a/core/embed/trezorhal/stm32f4/displays/ili9341_spi.c b/core/embed/trezorhal/stm32f4/displays/ili9341_spi.c deleted file mode 100644 index 1b317c6752..0000000000 --- a/core/embed/trezorhal/stm32f4/displays/ili9341_spi.c +++ /dev/null @@ -1,512 +0,0 @@ - - -#include -#include - -#include "ili9341_spi.h" - -/** - * @brief ILI9341 chip IDs - */ -#define ILI9341_ID 0x9341 - -/** - * @brief ILI9341 Size - */ -#define ILI9341_LCD_PIXEL_WIDTH ((uint16_t)240) -#define ILI9341_LCD_PIXEL_HEIGHT ((uint16_t)320) - -/** - * @brief ILI9341 Timing - */ -/* Timing configuration (Typical configuration from ILI9341 datasheet) - HSYNC=10 (9+1) - HBP=20 (29-10+1) - ActiveW=240 (269-20-10+1) - HFP=10 (279-240-20-10+1) - - VSYNC=2 (1+1) - VBP=2 (3-2+1) - ActiveH=320 (323-2-2+1) - VFP=4 (327-320-2-2+1) -*/ - -/** - * @brief ILI9341 Registers - */ - -/* Level 1 Commands */ -#define LCD_SWRESET 0x01 /* Software Reset */ -#define LCD_READ_DISPLAY_ID 0x04 /* Read display identification information */ -#define LCD_RDDST 0x09 /* Read Display Status */ -#define LCD_RDDPM 0x0A /* Read Display Power Mode */ -#define LCD_RDDMADCTL 0x0B /* Read Display MADCTL */ -#define LCD_RDDCOLMOD 0x0C /* Read Display Pixel Format */ -#define LCD_RDDIM 0x0D /* Read Display Image Format */ -#define LCD_RDDSM 0x0E /* Read Display Signal Mode */ -#define LCD_RDDSDR 0x0F /* Read Display Self-Diagnostic Result */ -#define LCD_SPLIN 0x10 /* Enter Sleep Mode */ -#define LCD_SLEEP_OUT 0x11 /* Sleep out register */ -#define LCD_PTLON 0x12 /* Partial Mode ON */ -#define LCD_NORMAL_MODE_ON 0x13 /* Normal Display Mode ON */ -#define LCD_DINVOFF 0x20 /* Display Inversion OFF */ -#define LCD_DINVON 0x21 /* Display Inversion ON */ -#define LCD_GAMMA 0x26 /* Gamma register */ -#define LCD_DISPLAY_OFF 0x28 /* Display off register */ -#define LCD_DISPLAY_ON 0x29 /* Display on register */ -#define LCD_COLUMN_ADDR 0x2A /* Colomn address register */ -#define LCD_PAGE_ADDR 0x2B /* Page address register */ -#define LCD_GRAM 0x2C /* GRAM register */ -#define LCD_RGBSET 0x2D /* Color SET */ -#define LCD_RAMRD 0x2E /* Memory Read */ -#define LCD_PLTAR 0x30 /* Partial Area */ -#define LCD_VSCRDEF 0x33 /* Vertical Scrolling Definition */ -#define LCD_TEOFF 0x34 /* Tearing Effect Line OFF */ -#define LCD_TEON 0x35 /* Tearing Effect Line ON */ -#define LCD_MAC 0x36 /* Memory Access Control register*/ -#define LCD_VSCRSADD 0x37 /* Vertical Scrolling Start Address */ -#define LCD_IDMOFF 0x38 /* Idle Mode OFF */ -#define LCD_IDMON 0x39 /* Idle Mode ON */ -#define LCD_PIXEL_FORMAT 0x3A /* Pixel Format register */ -#define LCD_WRITE_MEM_CONTINUE 0x3C /* Write Memory Continue */ -#define LCD_READ_MEM_CONTINUE 0x3E /* Read Memory Continue */ -#define LCD_SET_TEAR_SCANLINE 0x44 /* Set Tear Scanline */ -#define LCD_GET_SCANLINE 0x45 /* Get Scanline */ -#define LCD_WDB 0x51 /* Write Brightness Display register */ -#define LCD_RDDISBV 0x52 /* Read Display Brightness */ -#define LCD_WCD 0x53 /* Write Control Display register*/ -#define LCD_RDCTRLD 0x54 /* Read CTRL Display */ -#define LCD_WRCABC 0x55 /* Write Content Adaptive Brightness Control */ -#define LCD_RDCABC 0x56 /* Read Content Adaptive Brightness Control */ -#define LCD_WRITE_CABC 0x5E /* Write CABC Minimum Brightness */ -#define LCD_READ_CABC 0x5F /* Read CABC Minimum Brightness */ -#define LCD_READ_ID1 0xDA /* Read ID1 */ -#define LCD_READ_ID2 0xDB /* Read ID2 */ -#define LCD_READ_ID3 0xDC /* Read ID3 */ - -/* Level 2 Commands */ -#define LCD_RGB_INTERFACE 0xB0 /* RGB Interface Signal Control */ -#define LCD_FRMCTR1 0xB1 /* Frame Rate Control (In Normal Mode) */ -#define LCD_FRMCTR2 0xB2 /* Frame Rate Control (In Idle Mode) */ -#define LCD_FRMCTR3 0xB3 /* Frame Rate Control (In Partial Mode) */ -#define LCD_INVTR 0xB4 /* Display Inversion Control */ -#define LCD_BPC 0xB5 /* Blanking Porch Control register */ -#define LCD_DFC 0xB6 /* Display Function Control register */ -#define LCD_ETMOD 0xB7 /* Entry Mode Set */ -#define LCD_BACKLIGHT1 0xB8 /* Backlight Control 1 */ -#define LCD_BACKLIGHT2 0xB9 /* Backlight Control 2 */ -#define LCD_BACKLIGHT3 0xBA /* Backlight Control 3 */ -#define LCD_BACKLIGHT4 0xBB /* Backlight Control 4 */ -#define LCD_BACKLIGHT5 0xBC /* Backlight Control 5 */ -#define LCD_BACKLIGHT7 0xBE /* Backlight Control 7 */ -#define LCD_BACKLIGHT8 0xBF /* Backlight Control 8 */ -#define LCD_POWER1 0xC0 /* Power Control 1 register */ -#define LCD_POWER2 0xC1 /* Power Control 2 register */ -#define LCD_VCOM1 0xC5 /* VCOM Control 1 register */ -#define LCD_VCOM2 0xC7 /* VCOM Control 2 register */ -#define LCD_NVMWR 0xD0 /* NV Memory Write */ -#define LCD_NVMPKEY 0xD1 /* NV Memory Protection Key */ -#define LCD_RDNVM 0xD2 /* NV Memory Status Read */ -#define LCD_READ_ID4 0xD3 /* Read ID4 */ -#define LCD_PGAMMA 0xE0 /* Positive Gamma Correction register */ -#define LCD_NGAMMA 0xE1 /* Negative Gamma Correction register */ -#define LCD_DGAMCTRL1 0xE2 /* Digital Gamma Control 1 */ -#define LCD_DGAMCTRL2 0xE3 /* Digital Gamma Control 2 */ -#define LCD_INTERFACE 0xF6 /* Interface control register */ - -/* Extend register commands */ -#define LCD_POWERA 0xCB /* Power control A register */ -#define LCD_POWERB 0xCF /* Power control B register */ -#define LCD_DTCA 0xE8 /* Driver timing control A */ -#define LCD_DTCB 0xEA /* Driver timing control B */ -#define LCD_POWER_SEQ 0xED /* Power on sequence register */ -#define LCD_3GAMMA_EN 0xF2 /* 3 Gamma enable register */ -#define LCD_PRC 0xF7 /* Pump ratio control register */ - -/* Size of read registers */ -#define LCD_READ_ID4_SIZE 3 /* Size of Read ID4 */ - -/*############################### SPIx #######################################*/ -#define DISCOVERY_SPIx SPI5 -#define DISCOVERY_SPIx_CLK_ENABLE() __HAL_RCC_SPI5_CLK_ENABLE() -#define DISCOVERY_SPIx_GPIO_PORT GPIOF /* GPIOF */ -#define DISCOVERY_SPIx_AF GPIO_AF5_SPI5 -#define DISCOVERY_SPIx_GPIO_CLK_ENABLE() __HAL_RCC_GPIOF_CLK_ENABLE() -#define DISCOVERY_SPIx_GPIO_CLK_DISABLE() __HAL_RCC_GPIOF_CLK_DISABLE() -#define DISCOVERY_SPIx_SCK_PIN GPIO_PIN_7 /* PF.07 */ -#define DISCOVERY_SPIx_MISO_PIN GPIO_PIN_8 /* PF.08 */ -#define DISCOVERY_SPIx_MOSI_PIN GPIO_PIN_9 /* PF.09 */ -/* Maximum Timeout values for flags waiting loops. These timeouts are not based - on accurate values, they just guarantee that the application will not remain - stuck if the SPI communication is corrupted. - You may modify these timeout values depending on CPU frequency and - application conditions (interrupts routines ...). */ -#define SPIx_TIMEOUT_MAX ((uint32_t)0x1000) - -/*################################ LCD #######################################*/ -/* Chip Select macro definition */ -#define LCD_CS_LOW() \ - HAL_GPIO_WritePin(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, GPIO_PIN_RESET) -#define LCD_CS_HIGH() \ - HAL_GPIO_WritePin(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, GPIO_PIN_SET) - -/* Set WRX High to send data */ -#define LCD_WRX_LOW() \ - HAL_GPIO_WritePin(LCD_WRX_GPIO_PORT, LCD_WRX_PIN, GPIO_PIN_RESET) -#define LCD_WRX_HIGH() \ - HAL_GPIO_WritePin(LCD_WRX_GPIO_PORT, LCD_WRX_PIN, GPIO_PIN_SET) - -/* Set WRX High to send data */ -#define LCD_RDX_LOW() \ - HAL_GPIO_WritePin(LCD_RDX_GPIO_PORT, LCD_RDX_PIN, GPIO_PIN_RESET) -#define LCD_RDX_HIGH() \ - HAL_GPIO_WritePin(LCD_RDX_GPIO_PORT, LCD_RDX_PIN, GPIO_PIN_SET) - -/** - * @brief LCD Control pin - */ -#define LCD_NCS_PIN GPIO_PIN_2 -#define LCD_NCS_GPIO_PORT GPIOC -#define LCD_NCS_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() -#define LCD_NCS_GPIO_CLK_DISABLE() __HAL_RCC_GPIOC_CLK_DISABLE() -/** - * @} - */ -/** - * @brief LCD Command/data pin - */ -#define LCD_WRX_PIN GPIO_PIN_13 -#define LCD_WRX_GPIO_PORT GPIOD -#define LCD_WRX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE() -#define LCD_WRX_GPIO_CLK_DISABLE() __HAL_RCC_GPIOD_CLK_DISABLE() - -#define LCD_RDX_PIN GPIO_PIN_12 -#define LCD_RDX_GPIO_PORT GPIOD -#define LCD_RDX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE() -#define LCD_RDX_GPIO_CLK_DISABLE() __HAL_RCC_GPIOD_CLK_DISABLE() - -static SPI_HandleTypeDef SpiHandle; -uint32_t SpixTimeout = - SPIx_TIMEOUT_MAX; /*. - */ - -#include -#include - -#include "display.h" -#include "ili9341_spi.h" -#include "memzero.h" -#include "sdram.h" - -#define MAX_LAYER_NUMBER 2 -#define LCD_FRAME_BUFFER ((uint32_t)SDRAM_DEVICE_ADDR) - -LTDC_HandleTypeDef LtdcHandler; -static RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; - -/* Default LCD configuration with LCD Layer 1 */ -uint32_t ActiveLayer = 0; -// static LCD_DrawPropTypeDef DrawProp[MAX_LAYER_NUMBER]; -// LCD_DrvTypeDef *LcdDrv; - -static int DISPLAY_BACKLIGHT = -1; -static int DISPLAY_ORIENTATION = -1; - -// this is just for compatibility with DMA2D using algorithms -uint8_t *const DISPLAY_DATA_ADDRESS = 0; - -uint16_t cursor_x = 0; -uint16_t cursor_y = 0; -uint16_t window_x0 = 0; -uint16_t window_y0 = DISPLAY_RESX - 1; -uint16_t window_x1 = 0; -uint16_t window_y1 = DISPLAY_RESY - 1; - -void display_pixeldata(uint16_t c) { - ((uint16_t *)LCD_FRAME_BUFFER)[(cursor_y * DISPLAY_RESX) + cursor_x] = c; - - cursor_x++; - - if (cursor_x > window_x1) { - cursor_x = window_x0; - cursor_y++; - - if (cursor_y > window_y1) { - cursor_y = window_y0; - } - } -} - -void display_pixeldata_dirty(void) {} - -void display_reset_state() {} - -static void __attribute__((unused)) display_sleep(void) {} - -static void display_unsleep(void) {} - -/** - * @brief Initializes the LCD layers. - * @param LayerIndex: the layer foreground or background. - * @param FB_Address: the layer frame buffer. - */ -void BSP_LCD_LayerDefaultInit(uint16_t LayerIndex, uint32_t FB_Address) { - LTDC_LayerCfgTypeDef Layercfg = {0}; - - /* Layer Init */ - Layercfg.WindowX0 = 0; - Layercfg.WindowX1 = DISPLAY_RESX; - Layercfg.WindowY0 = 0; - Layercfg.WindowY1 = DISPLAY_RESY; - Layercfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565; - Layercfg.FBStartAdress = FB_Address; - Layercfg.Alpha = 255; - Layercfg.Alpha0 = 0; - Layercfg.Backcolor.Blue = 0; - Layercfg.Backcolor.Green = 0; - Layercfg.Backcolor.Red = 0; - Layercfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA; - Layercfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA; - Layercfg.ImageWidth = DISPLAY_RESX; - Layercfg.ImageHeight = DISPLAY_RESY; - - HAL_LTDC_ConfigLayer(&LtdcHandler, &Layercfg, LayerIndex); - - // DrawProp[LayerIndex].BackColor = LCD_COLOR_WHITE; - // DrawProp[LayerIndex].pFont = &Font24; - // DrawProp[LayerIndex].TextColor = LCD_COLOR_BLACK; - - /* Dithering activation */ - HAL_LTDC_EnableDither(&LtdcHandler); -} - -/** - * @brief Selects the LCD Layer. - * @param LayerIndex: the Layer foreground or background. - */ -void BSP_LCD_SelectLayer(uint32_t LayerIndex) { ActiveLayer = LayerIndex; } - -/** - * @brief Sets a LCD Layer visible. - * @param LayerIndex: the visible Layer. - * @param state: new state of the specified layer. - * This parameter can be: ENABLE or DISABLE. - */ -void BSP_LCD_SetLayerVisible(uint32_t LayerIndex, FunctionalState state) { - if (state == ENABLE) { - __HAL_LTDC_LAYER_ENABLE(&LtdcHandler, LayerIndex); - } else { - __HAL_LTDC_LAYER_DISABLE(&LtdcHandler, LayerIndex); - } - __HAL_LTDC_RELOAD_CONFIG(&LtdcHandler); -} - -/** - * @brief Sets an LCD Layer visible without reloading. - * @param LayerIndex: Visible Layer - * @param State: New state of the specified layer - * This parameter can be one of the following values: - * @arg ENABLE - * @arg DISABLE - * @retval None - */ -void BSP_LCD_SetLayerVisible_NoReload(uint32_t LayerIndex, - FunctionalState State) { - if (State == ENABLE) { - __HAL_LTDC_LAYER_ENABLE(&LtdcHandler, LayerIndex); - } else { - __HAL_LTDC_LAYER_DISABLE(&LtdcHandler, LayerIndex); - } - /* Do not Sets the Reload */ -} - -/** - * @brief Configures the Transparency. - * @param LayerIndex: the Layer foreground or background. - * @param Transparency: the Transparency, - * This parameter must range from 0x00 to 0xFF. - */ -void BSP_LCD_SetTransparency(uint32_t LayerIndex, uint8_t Transparency) { - HAL_LTDC_SetAlpha(&LtdcHandler, Transparency, LayerIndex); -} - -/** - * @brief Configures the transparency without reloading. - * @param LayerIndex: Layer foreground or background. - * @param Transparency: Transparency - * This parameter must be a number between Min_Data = 0x00 and - * Max_Data = 0xFF - * @retval None - */ -void BSP_LCD_SetTransparency_NoReload(uint32_t LayerIndex, - uint8_t Transparency) { - HAL_LTDC_SetAlpha_NoReload(&LtdcHandler, Transparency, LayerIndex); -} - -/** - * @brief Sets a LCD layer frame buffer address. - * @param LayerIndex: specifies the Layer foreground or background - * @param Address: new LCD frame buffer value - */ -void BSP_LCD_SetLayerAddress(uint32_t LayerIndex, uint32_t Address) { - HAL_LTDC_SetAddress(&LtdcHandler, Address, LayerIndex); -} - -/** - * @brief Sets an LCD layer frame buffer address without reloading. - * @param LayerIndex: Layer foreground or background - * @param Address: New LCD frame buffer value - * @retval None - */ -void BSP_LCD_SetLayerAddress_NoReload(uint32_t LayerIndex, uint32_t Address) { - HAL_LTDC_SetAddress_NoReload(&LtdcHandler, Address, LayerIndex); -} - -// static struct { uint16_t x, y; } BUFFER_OFFSET; - -void display_set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { - window_x0 = x0; - window_x1 = x1; - window_y0 = y0; - window_y1 = y1; - cursor_x = x0; - cursor_y = y0; - - // /* Reconfigure the layer size */ - // HAL_LTDC_SetWindowSize_NoReload(&LtdcHandler, x1-x0 + 1, y1-y0 + 1, 0); - // - // /* Reconfigure the layer position */ - // HAL_LTDC_SetWindowPosition_NoReload(&LtdcHandler, x0, y0, 0); -} - -int display_orientation(int degrees) { return 0; } - -int display_get_orientation(void) { return DISPLAY_ORIENTATION; } - -int display_backlight(int val) { - if (DISPLAY_BACKLIGHT != val && val >= 0 && val <= 255) { - DISPLAY_BACKLIGHT = val; - // TIM1->CCR1 = LED_PWM_TIM_PERIOD * val / 255; - } - return DISPLAY_BACKLIGHT; -} - -void display_init_seq(void) { display_unsleep(); } - -void display_init_all(void) { - GPIO_InitTypeDef GPIO_InitStructure = {0}; - - /* Enable the LTDC and DMA2D Clock */ - __HAL_RCC_LTDC_CLK_ENABLE(); - __HAL_RCC_DMA2D_CLK_ENABLE(); - - /* Enable GPIOs clock */ - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOD_CLK_ENABLE(); - __HAL_RCC_GPIOF_CLK_ENABLE(); - __HAL_RCC_GPIOG_CLK_ENABLE(); - - /* GPIOs Configuration */ - /* - +------------------------+-----------------------+----------------------------+ - + LCD pins assignment + - +------------------------+-----------------------+----------------------------+ - | LCD_TFT R2 <-> PC.10 | LCD_TFT G2 <-> PA.06 | LCD_TFT B2 <-> PD.06 | | - LCD_TFT R3 <-> PB.00 | LCD_TFT G3 <-> PG.10 | LCD_TFT B3 <-> PG.11 | - | LCD_TFT R4 <-> PA.11 | LCD_TFT G4 <-> PB.10 | LCD_TFT B4 <-> PG.12 | | - LCD_TFT R5 <-> PA.12 | LCD_TFT G5 <-> PB.11 | LCD_TFT B5 <-> PA.03 | - | LCD_TFT R6 <-> PB.01 | LCD_TFT G6 <-> PC.07 | LCD_TFT B6 <-> PB.08 | | - LCD_TFT R7 <-> PG.06 | LCD_TFT G7 <-> PD.03 | LCD_TFT B7 <-> PB.09 | - ------------------------------------------------------------------------------- - | LCD_TFT HSYNC <-> PC.06 | LCDTFT VSYNC <-> PA.04 | - | LCD_TFT CLK <-> PG.07 | LCD_TFT DE <-> PF.10 | - ----------------------------------------------------- - */ - - /* GPIOA configuration */ - GPIO_InitStructure.Pin = - GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_6 | GPIO_PIN_11 | GPIO_PIN_12; - GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Speed = GPIO_SPEED_FAST; - GPIO_InitStructure.Alternate = GPIO_AF14_LTDC; - HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); - - /* GPIOB configuration */ - GPIO_InitStructure.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11; - HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); - - /* GPIOC configuration */ - GPIO_InitStructure.Pin = GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_10; - HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); - - /* GPIOD configuration */ - GPIO_InitStructure.Pin = GPIO_PIN_3 | GPIO_PIN_6; - HAL_GPIO_Init(GPIOD, &GPIO_InitStructure); - - /* GPIOF configuration */ - GPIO_InitStructure.Pin = GPIO_PIN_10; - HAL_GPIO_Init(GPIOF, &GPIO_InitStructure); - - /* GPIOG configuration */ - GPIO_InitStructure.Pin = GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_11; - HAL_GPIO_Init(GPIOG, &GPIO_InitStructure); - - /* GPIOB configuration */ - GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1; - GPIO_InitStructure.Alternate = GPIO_AF9_LTDC; - HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); - - /* GPIOG configuration */ - GPIO_InitStructure.Pin = GPIO_PIN_10 | GPIO_PIN_12; - HAL_GPIO_Init(GPIOG, &GPIO_InitStructure); - - /* On STM32F429I-DISCO, it is not possible to read ILI9341 ID because */ - /* PIN EXTC is not connected to VDD and then LCD_READ_ID4 is not accessible. - */ - /* In this case, ReadID function is bypassed.*/ - /*if(ili9341_drv.ReadID() == ILI9341_ID)*/ - - /* LTDC Configuration ----------------------------------------------------*/ - LtdcHandler.Instance = LTDC; - - /* Timing configuration (Typical configuration from ILI9341 datasheet) - HSYNC=10 (9+1) - HBP=20 (29-10+1) - ActiveW=240 (269-20-10+1) - HFP=10 (279-240-20-10+1) - - VSYNC=2 (1+1) - VBP=2 (3-2+1) - ActiveH=320 (323-2-2+1) - VFP=4 (327-320-2-2+1) - */ - - /* Configure horizontal synchronization width */ - LtdcHandler.Init.HorizontalSync = ILI9341_HSYNC; - /* Configure vertical synchronization height */ - LtdcHandler.Init.VerticalSync = ILI9341_VSYNC; - /* Configure accumulated horizontal back porch */ - LtdcHandler.Init.AccumulatedHBP = ILI9341_HBP; - /* Configure accumulated vertical back porch */ - LtdcHandler.Init.AccumulatedVBP = ILI9341_VBP; - /* Configure accumulated active width */ - LtdcHandler.Init.AccumulatedActiveW = 269; - /* Configure accumulated active height */ - LtdcHandler.Init.AccumulatedActiveH = 323; - /* Configure total width */ - LtdcHandler.Init.TotalWidth = 279; - /* Configure total height */ - LtdcHandler.Init.TotalHeigh = 327; - - /* Configure R,G,B component values for LCD background color */ - LtdcHandler.Init.Backcolor.Red = 0; - LtdcHandler.Init.Backcolor.Blue = 0; - LtdcHandler.Init.Backcolor.Green = 0; - - /* LCD clock configuration */ - /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 192 Mhz */ - /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 192/4 = 48 Mhz */ - /* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_8 = 48/4 = 6Mhz */ - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; - PeriphClkInitStruct.PLLSAI.PLLSAIN = 192; - PeriphClkInitStruct.PLLSAI.PLLSAIR = 4; - PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_8; - HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); - - /* Polarity */ - LtdcHandler.Init.HSPolarity = LTDC_HSPOLARITY_AL; - LtdcHandler.Init.VSPolarity = LTDC_VSPOLARITY_AL; - LtdcHandler.Init.DEPolarity = LTDC_DEPOLARITY_AL; - LtdcHandler.Init.PCPolarity = LTDC_PCPOLARITY_IPC; - - HAL_LTDC_Init(&LtdcHandler); - - /* Initialize the LCD Layers */ - BSP_LCD_LayerDefaultInit(1, LCD_FRAME_BUFFER); - - memzero((void *)LCD_FRAME_BUFFER, 153600); - - ili9341_init(); - - display_init_seq(); -} - -void display_reinit(void) {} - -void display_refresh(void) {} - -void display_sync(void) {} - -const char *display_save(const char *prefix) { return NULL; } - -void display_clear_save(void) {} - -void display_efficient_clear(void) { - memzero((void *)LCD_FRAME_BUFFER, 153600); -} - -uint8_t *display_get_wr_addr(void) { - uint32_t address = LCD_FRAME_BUFFER; - /* Get the rectangle start address */ - address = (address + (2 * ((cursor_y)*DISPLAY_RESX + (cursor_x)))); - - return (uint8_t *)address; -} - -uint32_t *display_get_fb_addr(void) { return (uint32_t *)LCD_FRAME_BUFFER; } - -uint16_t display_get_window_width(void) { return window_x1 - window_x0 + 1; } - -uint16_t display_get_window_height(void) { return window_y1 - window_y0 + 1; } - -void display_shift_window(uint16_t pixels) { - uint16_t w = display_get_window_width(); - uint16_t h = display_get_window_height(); - - uint16_t line_rem = w - (cursor_x - window_x0); - - if (pixels < line_rem) { - cursor_x += pixels; - return; - } - - // start of next line - pixels = pixels - line_rem; - cursor_x = window_x0; - cursor_y++; - - // add the rest of pixels - cursor_y = window_y0 + (((cursor_y - window_y0) + (pixels / w)) % h); - cursor_x += pixels % w; -} - -uint16_t display_get_window_offset(void) { - return DISPLAY_RESX - display_get_window_width(); -} - -void display_finish_actions(void) {} diff --git a/core/embed/trezorhal/stm32f4/displays/ltdc.h b/core/embed/trezorhal/stm32f4/displays/ltdc.h deleted file mode 100644 index 34cb288a78..0000000000 --- a/core/embed/trezorhal/stm32f4/displays/ltdc.h +++ /dev/null @@ -1,22 +0,0 @@ - -#ifndef _LTDC_H -#define _LTDC_H - -#include - -#define DISPLAY_FRAMEBUFFER_WIDTH DISPLAY_RESX -#define DISPLAY_FRAMEBUFFER_HEIGHT DISPLAY_RESY -#define DISPLAY_FRAMEBUFFER_OFFSET_X 0 -#define DISPLAY_FRAMEBUFFER_OFFSET_Y 0 -#define DISPLAY_COLOR_MODE DMA2D_OUTPUT_RGB565 -#define DISPLAY_EFFICIENT_CLEAR 1 - -extern uint8_t* const DISPLAY_DATA_ADDRESS; - -static inline void display_pixel(uint8_t* fb, int16_t x, int16_t y, - uint16_t color) { - uint32_t p = 2 * (y * DISPLAY_FRAMEBUFFER_WIDTH + x); - *((uint16_t*)(fb + p)) = color; -} - -#endif //_LTDC_H diff --git a/core/embed/trezorhal/stm32f4/displays/panels/154a.c b/core/embed/trezorhal/stm32f4/displays/panels/154a.c deleted file mode 100644 index 4efeff70c2..0000000000 --- a/core/embed/trezorhal/stm32f4/displays/panels/154a.c +++ /dev/null @@ -1,115 +0,0 @@ - - -#include "displays/st7789v.h" - -void _154a_init_seq(void) { - // most recent manual: https://www.newhavendisplay.com/app_notes/ILI9341.pdf - // TEON: Tearing Effect Line On; V-blanking only - CMD(0x35); - DATA(0x00); - - // COLMOD: Interface Pixel format; 65K color: 16-bit/pixel (RGB 5-6-5 bits - // input) - CMD(0x3A); - DATA(0x55); - - // Display Function Control: gate scan direction 319 -> 0 - CMD(0xB6); - DATA(0x0A); - DATA(0xC2); - DATA(0x27); - DATA(0x00); - - // Interface Control: XOR BGR as ST7789V does - CMD(0xF6); - DATA(0x09); - DATA(0x30); - DATA(0x00); - - // the above config is the most important and definitely necessary - - CMD(0xCF); - DATA(0x00); - DATA(0xC1); - DATA(0x30); - - CMD(0xED); - DATA(0x64); - DATA(0x03); - DATA(0x12); - DATA(0x81); - - CMD(0xE8); - DATA(0x85); - DATA(0x10); - DATA(0x7A); - - CMD(0xF7); - DATA(0x20); - - CMD(0xEA); - DATA(0x00); - DATA(0x00); - - // power control VRH[5:0] - CMD(0xC0); - DATA(0x23); - - // power control SAP[2:0] BT[3:0] - CMD(0xC1); - DATA(0x12); - - // vcm control 1 - CMD(0xC5); - DATA(0x60); - DATA(0x44); - - // vcm control 2 - CMD(0xC7); - DATA(0x8A); - - // framerate - CMD(0xB1); - DATA(0x00); - DATA(0x18); - - // 3 gamma func disable - CMD(0xF2); - DATA(0x00); - - // gamma curve 1 - CMD(0xE0); - DATA(0x0F); - DATA(0x2F); - DATA(0x2C); - DATA(0x0B); - DATA(0x0F); - DATA(0x09); - DATA(0x56); - DATA(0xD9); - DATA(0x4A); - DATA(0x0B); - DATA(0x14); - DATA(0x05); - DATA(0x0C); - DATA(0x06); - DATA(0x00); - - // gamma curve 2 - CMD(0xE1); - DATA(0x00); - DATA(0x10); - DATA(0x13); - DATA(0x04); - DATA(0x10); - DATA(0x06); - DATA(0x25); - DATA(0x26); - DATA(0x3B); - DATA(0x04); - DATA(0x0B); - DATA(0x0A); - DATA(0x33); - DATA(0x39); - DATA(0x0F); -} diff --git a/core/embed/trezorhal/stm32f4/displays/panels/154a.h b/core/embed/trezorhal/stm32f4/displays/panels/154a.h deleted file mode 100644 index e9e6d66819..0000000000 --- a/core/embed/trezorhal/stm32f4/displays/panels/154a.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _154A_H_ -#define _154A_H_ - -// ILI9341 IC controller - -void _154a_init_seq(void); - -#endif diff --git a/core/embed/trezorhal/stm32f4/displays/panels/lx154a2411.c b/core/embed/trezorhal/stm32f4/displays/panels/lx154a2411.c deleted file mode 100644 index 7d1c878fc0..0000000000 --- a/core/embed/trezorhal/stm32f4/displays/panels/lx154a2411.c +++ /dev/null @@ -1,82 +0,0 @@ - -#include "displays/st7789v.h" - -void lx154a2411_gamma(void) { - // positive voltage correction - CMD(0xE0); - DATA(0xD0); - DATA(0x03); - DATA(0x08); - DATA(0x0E); - DATA(0x11); - DATA(0x2B); - DATA(0x3B); - DATA(0x44); - DATA(0x4C); - DATA(0x2B); - DATA(0x16); - DATA(0x15); - DATA(0x1E); - DATA(0x21); - - // negative voltage correction - CMD(0xE1); - DATA(0xD0); - DATA(0x03); - DATA(0x08); - DATA(0x0E); - DATA(0x11); - DATA(0x2B); - DATA(0x3B); - DATA(0x54); - DATA(0x4C); - DATA(0x2B); - DATA(0x16); - DATA(0x15); - DATA(0x1E); - DATA(0x21); -} - -void lx154a2411_init_seq(void) { - // most recent manual: - // https://www.newhavendisplay.com/appnotes/datasheets/LCDs/ST7789V.pdf - // TEON: Tearing Effect Line On; V-blanking only - CMD(0x35); - DATA(0x00); - - // COLMOD: Interface Pixel format; 65K color: 16-bit/pixel (RGB 5-6-5 bits - // input) - CMD(0x3A); - DATA(0x55); - - // CMD2EN: Commands in command table 2 can be executed when EXTC level is Low - CMD(0xDF); - DATA(0x5A); - DATA(0x69); - DATA(0x02); - DATA(0x01); - - // LCMCTRL: LCM Control: XOR RGB setting - CMD(0xC0); - DATA(0x20); - - // GATECTRL: Gate Control; NL = 240 gate lines, first scan line is gate 80.; - // gate scan direction 319 -> 0 - CMD(0xE4); - DATA(0x1D); - DATA(0x0A); - DATA(0x11); - - // INVOFF (20h): Display Inversion Off - // INVON (21h): Display Inversion On - CMD(0x20); - - // the above config is the most important and definitely necessary - - // PWCTRL1: Power Control 1 - CMD(0xD0); - DATA(0xA4); - DATA(0xA1); - - lx154a2411_gamma(); -} diff --git a/core/embed/trezorhal/stm32f4/displays/panels/lx154a2411.h b/core/embed/trezorhal/stm32f4/displays/panels/lx154a2411.h deleted file mode 100644 index a785ca6506..0000000000 --- a/core/embed/trezorhal/stm32f4/displays/panels/lx154a2411.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef LX154A2411_H_ -#define LX154A2411_H_ - -// ST7789_V IC controller -void lx154a2411_gamma(void); -void lx154a2411_init_seq(void); - -#endif diff --git a/core/embed/trezorhal/stm32f4/displays/panels/lx154a2422.c b/core/embed/trezorhal/stm32f4/displays/panels/lx154a2422.c deleted file mode 100644 index 9a632fd684..0000000000 --- a/core/embed/trezorhal/stm32f4/displays/panels/lx154a2422.c +++ /dev/null @@ -1,148 +0,0 @@ - -#include "display.h" -#include "displays/st7789v.h" -#include "touch.h" - -void lx154a2422_gamma(void) { - // positive voltage correction - CMD(0xE0); - DATA(0xD0); - DATA(0x0A); - DATA(0x10); - DATA(0x0A); - DATA(0x0A); - DATA(0x26); - DATA(0x36); - DATA(0x34); - DATA(0x4D); - DATA(0x18); - DATA(0x13); - DATA(0x14); - DATA(0x2F); - DATA(0x34); - - // negative voltage correction - CMD(0xE1); - DATA(0xD0); - DATA(0x0A); - DATA(0x10); - DATA(0x0A); - DATA(0x09); - DATA(0x26); - DATA(0x36); - DATA(0x53); - DATA(0x4C); - DATA(0x18); - DATA(0x14); - DATA(0x14); - DATA(0x2F); - DATA(0x34); -} - -void lx154a2422_init_seq(void) { - // most recent manual: - // https://www.newhavendisplay.com/appnotes/datasheets/LCDs/ST7789V.pdf - // TEON: Tearing Effect Line On; V-blanking only - CMD(0x35); - DATA(0x00); - - // COLMOD: Interface Pixel format; 65K color: 16-bit/pixel (RGB 5-6-5 bits - // input) - CMD(0x3A); - DATA(0x55); - - // CMD2EN: Commands in command table 2 can be executed when EXTC level is Low - CMD(0xDF); - DATA(0x5A); - DATA(0x69); - DATA(0x02); - DATA(0x01); - - // LCMCTRL: LCM Control: XOR RGB setting - CMD(0xC0); - DATA(0x20); - - // GATECTRL: Gate Control; NL = 240 gate lines, first scan line is gate 80.; - // gate scan direction 319 -> 0 - CMD(0xE4); - DATA(0x1D); - DATA(0x0A); - DATA(0x11); - - // INVOFF (20h): Display Inversion Off - // INVON (21h): Display Inversion On - CMD(0x21); - - // the above config is the most important and definitely necessary - - // PWCTRL1: Power Control 1 - CMD(0xD0); - DATA(0xA4); - DATA(0xA1); - - lx154a2422_gamma(); -} - -void lx154a2422_rotate(int degrees, display_padding_t* padding) { - uint16_t shift = 0; - char BX = 0, BY = 0; - -#define RGB (1 << 3) -#define ML (1 << 4) // vertical refresh order -#define MH (1 << 2) // horizontal refresh order -#define MV (1 << 5) -#define MX (1 << 6) -#define MY (1 << 7) - // MADCTL: Memory Data Access Control - reference: - // section 8.12 in the ST7789V manual - uint8_t display_command_parameter = 0; - switch (degrees) { - case 0: - display_command_parameter = 0; - BY = 0; - break; - case 90: - display_command_parameter = MV | MX | MH | ML; - BX = 1; - shift = 1; - break; - case 180: - display_command_parameter = MX | MY | MH | ML; - BY = 0; - shift = 1; - break; - case 270: - display_command_parameter = MV | MY; - BX = 1; - break; - } - - CMD(0x36); - DATA(display_command_parameter); - - if (shift) { - // GATECTRL: Gate Control; NL = 240 gate lines, first scan line is - // gate 80.; gate scan direction 319 -> 0 - CMD(0xE4); - DATA(0x1D); - DATA(0x00); - DATA(0x11); - } else { - // GATECTRL: Gate Control; NL = 240 gate lines, first scan line is - // gate 80.; gate scan direction 319 -> 0 - CMD(0xE4); - DATA(0x1D); - DATA(0x0A); - DATA(0x11); - } - - // reset the column and page extents - display_set_window(0, 0, DISPLAY_RESX - 1, DISPLAY_RESY - 1); - - padding->x = BX ? (MAX_DISPLAY_RESY - DISPLAY_RESY) : 0; - padding->y = BY ? (MAX_DISPLAY_RESY - DISPLAY_RESY) : 0; -} - -uint32_t lx154a2422_transform_touch_coords(uint16_t x, uint16_t y) { - return touch_pack_xy(x, y); -} diff --git a/core/embed/trezorhal/stm32f4/displays/panels/lx154a2422.h b/core/embed/trezorhal/stm32f4/displays/panels/lx154a2422.h deleted file mode 100644 index 73687a58a3..0000000000 --- a/core/embed/trezorhal/stm32f4/displays/panels/lx154a2422.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef LX154A2422_H_ -#define LX154A2422_H_ - -#include "displays/st7789v.h" - -void lx154a2422_init_seq(void); -void lx154a2422_gamma(void); -void lx154a2422_rotate(int degrees, display_padding_t* padding); -uint32_t lx154a2422_transform_touch_coords(uint16_t x, uint16_t y); - -#endif diff --git a/core/embed/trezorhal/stm32f4/displays/panels/tf15411a.c b/core/embed/trezorhal/stm32f4/displays/panels/tf15411a.c deleted file mode 100644 index 179e3018f9..0000000000 --- a/core/embed/trezorhal/stm32f4/displays/panels/tf15411a.c +++ /dev/null @@ -1,158 +0,0 @@ -#include "display.h" -#include "displays/st7789v.h" - -void tf15411a_init_seq(void) { - // Inter Register Enable1 - CMD(0xFE); - - // Inter Register Enable2 - CMD(0xEF); - - // TEON: Tearing Effect Line On; V-blanking only - CMD(0x35); - DATA(0x00); - - // COLMOD: Interface Pixel format; 65K color: 16-bit/pixel (RGB 5-6-5 bits - // input) - CMD(0x3A); - DATA(0x55); - - // Frame Rate - // CMD(0xE8); DATA(0x12); DATA(0x00); - - // Power Control 2 - CMD(0xC3); - DATA(0x27); - - // Power Control 3 - CMD(0xC4); - DATA(0x18); - - // Power Control 4 - CMD(0xC9); - DATA(0x1F); - - CMD(0xC5); - DATA(0x0F); - - CMD(0xC6); - DATA(0x00); - - CMD(0xC7); - DATA(0x10); - - CMD(0xC8); - DATA(0x01); - - CMD(0xFF); - DATA(0x62); - - CMD(0x99); - DATA(0x3E); - - CMD(0x9D); - DATA(0x4B); - - CMD(0x8E); - DATA(0x0F); - - // SET_GAMMA1 - CMD(0xF0); - DATA(0x8F); - DATA(0x1B); - DATA(0x05); - DATA(0x06); - DATA(0x07); - DATA(0x42); - - // SET_GAMMA3 - CMD(0xF2); - DATA(0x5C); - DATA(0x1F); - DATA(0x12); - DATA(0x10); - DATA(0x07); - DATA(0x43); - - // SET_GAMMA2 - CMD(0xF1); - DATA(0x59); - DATA(0xCF); - DATA(0xCF); - DATA(0x35); - DATA(0x37); - DATA(0x8F); - - // SET_GAMMA4 - CMD(0xF3); - DATA(0x58); - DATA(0xCF); - DATA(0xCF); - DATA(0x35); - DATA(0x37); - DATA(0x8F); -} - -void tf15411a_rotate(int degrees, display_padding_t* padding) { - uint16_t shift = 0; - char BX = 0, BY = 0; - -#define RGB (1 << 3) -#define ML (1 << 4) // vertical refresh order -#define MH (1 << 2) // horizontal refresh order -#define MV (1 << 5) -#define MX (1 << 6) -#define MY (1 << 7) - // MADCTL: Memory Data Access Control - reference: - // section 9.3 in the ILI9341 manual - // section 6.2.18 in the GC9307 manual - // section 8.12 in the ST7789V manual - uint8_t display_command_parameter = 0; - switch (degrees) { - case 0: - display_command_parameter = 0; - BY = 1; - break; - case 90: - display_command_parameter = MV | MX | MH | ML; - BX = 0; - shift = 1; - break; - case 180: - display_command_parameter = MX | MY | MH | ML; - BY = 1; - shift = 1; - break; - case 270: - display_command_parameter = MV | MY; - BX = 0; - break; - } - - display_command_parameter ^= RGB | MY; // XOR RGB and MY settings - - CMD(0x36); - DATA(display_command_parameter); - - if (shift) { - // GATECTRL: Gate Control; NL = 240 gate lines, first scan line is - // gate 80.; gate scan direction 319 -> 0 - CMD(0xE4); - DATA(0x1D); - DATA(0x00); - DATA(0x11); - } else { - // GATECTRL: Gate Control; NL = 240 gate lines, first scan line is - // gate 80.; gate scan direction 319 -> 0 - CMD(0xE4); - DATA(0x1D); - DATA(0x0A); - DATA(0x11); - } - - // reset the column and page extents - display_set_window(0, 0, DISPLAY_RESX - 1, DISPLAY_RESY - 1); - - padding->x = BX ? (MAX_DISPLAY_RESY - DISPLAY_RESY) : 0; - padding->y = BY ? (MAX_DISPLAY_RESY - DISPLAY_RESY) : 0; -} diff --git a/core/embed/trezorhal/stm32f4/displays/panels/tf15411a.h b/core/embed/trezorhal/stm32f4/displays/panels/tf15411a.h deleted file mode 100644 index fb5dd84e17..0000000000 --- a/core/embed/trezorhal/stm32f4/displays/panels/tf15411a.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef TF15411A_H_ -#define TF15411A_H_ - -// GC9307 IC controller - -void tf15411a_init_seq(void); -void tf15411a_rotate(int degrees, display_padding_t* padding); - -#endif diff --git a/core/embed/trezorhal/stm32f4/displays/st7789v.c b/core/embed/trezorhal/stm32f4/displays/st7789v.c deleted file mode 100644 index 47c98c4972..0000000000 --- a/core/embed/trezorhal/stm32f4/displays/st7789v.c +++ /dev/null @@ -1,769 +0,0 @@ -/* - * This file is part of the Trezor project, https://trezor.io/ - * - * Copyright (c) SatoshiLabs - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include - -#include "backlight_pwm.h" -#include "display.h" -#include "irq.h" -#include "memzero.h" -#include "st7789v.h" - -#ifdef TREZOR_MODEL_T -#include "displays/panels/154a.h" -#include "displays/panels/lx154a2411.h" -#include "displays/panels/lx154a2422.h" -#include "displays/panels/tf15411a.h" -#else -#include "displays/panels/lx154a2482.h" -#endif - -// using const volatile instead of #define results in binaries that change -// only in 1-byte when the flag changes. -// using #define leads compiler to over-optimize the code leading to bigger -// differencies in the resulting binaries. -const volatile uint8_t DISPLAY_ST7789V_INVERT_COLORS = 1; - -#ifndef FMC_BANK1 -#define FMC_BANK1 0x60000000U -#endif - -#define DISPLAY_MEMORY_BASE FMC_BANK1 -#define DISPLAY_MEMORY_PIN 16 -#ifdef DISPLAY_I8080_16BIT_DW -#define DISPLAY_ADDR_SHIFT 2 -#elif DISPLAY_I8080_8BIT_DW -#define DISPLAY_ADDR_SHIFT 1 -#endif - -__IO DISP_MEM_TYPE *const DISPLAY_CMD_ADDRESS = - (__IO DISP_MEM_TYPE *const)((uint32_t)DISPLAY_MEMORY_BASE); -__IO DISP_MEM_TYPE *const DISPLAY_DATA_ADDRESS = - (__IO DISP_MEM_TYPE *const)((uint32_t)DISPLAY_MEMORY_BASE | - (DISPLAY_ADDR_SHIFT << DISPLAY_MEMORY_PIN)); - -#ifdef FRAMEBUFFER -#ifndef STM32U5 -#error Framebuffer only supported on STM32U5 for now -#endif - -#ifndef BOARDLOADER -#include "bg_copy.h" -#endif - -#define DATA_TRANSFER(X) \ - DATA((X) & 0xFF); \ - DATA((X) >> 8) - -__attribute__((section(".fb1"))) -ALIGN_32BYTES(static uint16_t PhysFrameBuffer0[DISPLAY_RESX * DISPLAY_RESY]); -__attribute__((section(".fb2"))) -ALIGN_32BYTES(static uint16_t PhysFrameBuffer1[DISPLAY_RESX * DISPLAY_RESY]); - -__attribute__(( - section(".framebuffer_select"))) static uint32_t act_frame_buffer = 0; - -#ifndef BOARDLOADER -static bool pending_fb_switch = false; -#endif - -static uint16_t window_x0 = 0; -static uint16_t window_y0 = 0; -static uint16_t window_x1 = 0; -static uint16_t window_y1 = 0; -static uint16_t cursor_x = 0; -static uint16_t cursor_y = 0; - -#else -#define DATA_TRANSFER(X) PIXELDATA(X) -#endif - -// section "9.1.3 RDDID (04h): Read Display ID" -// of ST7789V datasheet -#define DISPLAY_ID_ST7789V 0x858552U - -// section "6.2.1. Read display identification information (04h)" -// of GC9307 datasheet -#define DISPLAY_ID_GC9307 0x009307U - -// section "8.3.23 Read ID4 (D3h)" -// of ILI9341V datasheet -#define DISPLAY_ID_ILI9341V 0x009341U - -static int DISPLAY_ORIENTATION = -1; -static display_padding_t DISPLAY_PADDING = {0}; - -void display_pixeldata_dirty(void) {} - -#ifdef DISPLAY_IDENTIFY - -static uint32_t read_display_id(uint8_t command) { - volatile uint8_t c = 0; - uint32_t id = 0; - CMD(command); - c = *DISPLAY_DATA_ADDRESS; // first returned value is a dummy value and - // should be discarded - c = *DISPLAY_DATA_ADDRESS; - id |= (c << 16); - c = *DISPLAY_DATA_ADDRESS; - id |= (c << 8); - c = *DISPLAY_DATA_ADDRESS; - id |= c; - return id; -} - -static uint32_t display_identify(void) { - static uint32_t id = 0x000000U; - static char id_set = 0; - - if (id_set) return id; // return if id has been already set - - id = read_display_id(0x04); // RDDID: Read Display ID - // the default RDDID for ILI9341 should be 0x8000. - // some display modules return 0x0. - // the ILI9341 has an extra id, let's check it here. - if ((id != DISPLAY_ID_ST7789V) && - (id != DISPLAY_ID_GC9307)) { // if not ST7789V and not GC9307 - uint32_t id4 = read_display_id(0xD3); // Read ID4 - if (id4 == DISPLAY_ID_ILI9341V) { // definitely found a ILI9341 - id = id4; - } - } - id_set = 1; - return id; -} -#else -static uint32_t display_identify(void) { return DISPLAY_ID_ST7789V; } -#endif - -bool display_is_inverted() { - bool inv_on = false; - uint32_t id = display_identify(); - if (id == DISPLAY_ID_ST7789V) { - volatile uint8_t c = 0; - CMD(0x09); // read display status - c = *DISPLAY_DATA_ADDRESS; // don't care - c = *DISPLAY_DATA_ADDRESS; // don't care - c = *DISPLAY_DATA_ADDRESS; // don't care - c = *DISPLAY_DATA_ADDRESS; - if (c & 0x20) { - inv_on = true; - } - c = *DISPLAY_DATA_ADDRESS; // don't care - } - - return inv_on; -} - -void display_reset_state() {} - -static void __attribute__((unused)) display_sleep(void) { - uint32_t id = display_identify(); - if ((id == DISPLAY_ID_ILI9341V) || (id == DISPLAY_ID_GC9307) || - (id == DISPLAY_ID_ST7789V)) { - CMD(0x28); // DISPOFF: Display Off - CMD(0x10); // SLPIN: Sleep in - HAL_Delay(5); // need to wait 5 milliseconds after "sleep in" before - // sending any new commands - } -} - -static void display_unsleep(void) { - uint32_t id = display_identify(); - if ((id == DISPLAY_ID_ILI9341V) || (id == DISPLAY_ID_GC9307) || - (id == DISPLAY_ID_ST7789V)) { - CMD(0x11); // SLPOUT: Sleep Out - HAL_Delay(5); // need to wait 5 milliseconds after "sleep out" before - // sending any new commands - CMD(0x29); // DISPON: Display On - } -} - -void panel_set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { - x0 += DISPLAY_PADDING.x; - x1 += DISPLAY_PADDING.x; - y0 += DISPLAY_PADDING.y; - y1 += DISPLAY_PADDING.y; - uint32_t id = display_identify(); - if ((id == DISPLAY_ID_ILI9341V) || (id == DISPLAY_ID_GC9307) || - (id == DISPLAY_ID_ST7789V)) { - CMD(0x2A); - DATA(x0 >> 8); - DATA(x0 & 0xFF); - DATA(x1 >> 8); - DATA(x1 & 0xFF); // column addr set - CMD(0x2B); - DATA(y0 >> 8); - DATA(y0 & 0xFF); - DATA(y1 >> 8); - DATA(y1 & 0xFF); // row addr set - CMD(0x2C); - } -} - -int display_orientation(int degrees) { - if (degrees != DISPLAY_ORIENTATION) { - if (degrees == 0 || degrees == 90 || degrees == 180 || degrees == 270) { - DISPLAY_ORIENTATION = degrees; - - panel_set_window(0, 0, MAX_DISPLAY_RESX - 1, MAX_DISPLAY_RESY - 1); -#ifdef FRAMEBUFFER - memzero(PhysFrameBuffer1, sizeof(PhysFrameBuffer1)); - memzero(PhysFrameBuffer0, sizeof(PhysFrameBuffer0)); -#endif - for (uint32_t i = 0; i < MAX_DISPLAY_RESX * MAX_DISPLAY_RESY; i++) { - // 2 bytes per pixel because we're using RGB 5-6-5 format - DATA_TRANSFER(0x0000); - } -#ifdef TREZOR_MODEL_T - uint32_t id = display_identify(); - if (id == DISPLAY_ID_GC9307) { - tf15411a_rotate(degrees, &DISPLAY_PADDING); - } else { - lx154a2422_rotate(degrees, &DISPLAY_PADDING); - } -#else - lx154a2482_rotate(degrees, &DISPLAY_PADDING); -#endif - panel_set_window(0, 0, DISPLAY_RESX - 1, DISPLAY_RESY - 1); - } - } - return DISPLAY_ORIENTATION; -} - -int display_get_orientation(void) { return DISPLAY_ORIENTATION; } - -static inline uint32_t is_mode_handler(void) { - uint32_t r0; - __asm__ volatile("mrs %0, ipsr" : "=r"(r0)); - return (r0 & 0x1FF) != 0; -} - -int display_backlight(int val) { -#ifdef FRAMEBUFFER -#ifndef BOARDLOADER - // wait for DMA transfer to finish before changing backlight - // so that we know that panel has current data - if (backlight_pwm_get() != val && !is_mode_handler()) { - bg_copy_wait(); - } -#endif -#endif - - return backlight_pwm_set(val); -} - -void display_init_seq(void) { - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET); // LCD_RST/PC14 - // wait 10 milliseconds. only needs to be low for 10 microseconds. - // my dev display module ties display reset and touch panel reset together. - // keeping this low for max(display_reset_time, ctpm_reset_time) aids - // development and does not hurt. - HAL_Delay(10); - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_SET); // LCD_RST/PC14 - // max wait time for hardware reset is 120 milliseconds - // (experienced display flakiness using only 5ms wait before sending commands) - HAL_Delay(120); - - // identify the controller we will communicate with -#ifdef TREZOR_MODEL_T - uint32_t id = display_identify(); - if (id == DISPLAY_ID_GC9307) { - tf15411a_init_seq(); - } else if (id == DISPLAY_ID_ST7789V) { - if (DISPLAY_ST7789V_INVERT_COLORS) { - lx154a2422_init_seq(); - } else { - lx154a2411_init_seq(); - } - } else if (id == DISPLAY_ID_ILI9341V) { - _154a_init_seq(); - } -#else - lx154a2482_init_seq(); -#endif - - display_unsleep(); -} - -void display_setup_fmc(void) { - // Reference UM1725 "Description of STM32F4 HAL and LL drivers", - // section 64.2.1 "How to use this driver" - SRAM_HandleTypeDef external_display_data_sram = {0}; - external_display_data_sram.Instance = FMC_NORSRAM_DEVICE; - external_display_data_sram.Extended = FMC_NORSRAM_EXTENDED_DEVICE; - external_display_data_sram.Init.NSBank = FMC_NORSRAM_BANK1; - external_display_data_sram.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE; - external_display_data_sram.Init.MemoryType = FMC_MEMORY_TYPE_SRAM; -#ifdef DISPLAY_I8080_16BIT_DW - external_display_data_sram.Init.MemoryDataWidth = - FMC_NORSRAM_MEM_BUS_WIDTH_16; -#elif DISPLAY_I8080_8BIT_DW - external_display_data_sram.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_8; -#endif - external_display_data_sram.Init.BurstAccessMode = - FMC_BURST_ACCESS_MODE_DISABLE; - external_display_data_sram.Init.WaitSignalPolarity = - FMC_WAIT_SIGNAL_POLARITY_LOW; - external_display_data_sram.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS; - external_display_data_sram.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE; - external_display_data_sram.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE; - external_display_data_sram.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE; - external_display_data_sram.Init.AsynchronousWait = - FMC_ASYNCHRONOUS_WAIT_DISABLE; - external_display_data_sram.Init.WriteBurst = FMC_WRITE_BURST_DISABLE; - external_display_data_sram.Init.ContinuousClock = - FMC_CONTINUOUS_CLOCK_SYNC_ONLY; - external_display_data_sram.Init.PageSize = FMC_PAGE_SIZE_NONE; - -#ifdef STM32F4 - // reference RM0090 section 37.5 Table 259, 37.5.4, Mode 1 SRAM, and 37.5.6 - FMC_NORSRAM_TimingTypeDef normal_mode_timing = {0}; - normal_mode_timing.AddressSetupTime = 5; - normal_mode_timing.AddressHoldTime = 1; // don't care - normal_mode_timing.DataSetupTime = 6; - normal_mode_timing.BusTurnAroundDuration = 0; // don't care - normal_mode_timing.CLKDivision = 2; // don't care - normal_mode_timing.DataLatency = 2; // don't care - normal_mode_timing.AccessMode = FMC_ACCESS_MODE_A; - - HAL_SRAM_Init(&external_display_data_sram, &normal_mode_timing, NULL); - -#else - external_display_data_sram.Init.ExtendedMode = FMC_EXTENDED_MODE_ENABLE; - - FMC_NORSRAM_TimingTypeDef normal_mode_timing = {0}; - normal_mode_timing.AddressSetupTime = 15; - normal_mode_timing.AddressHoldTime = 1; // don't care - normal_mode_timing.DataSetupTime = 11; - normal_mode_timing.BusTurnAroundDuration = 0; // don't care - normal_mode_timing.CLKDivision = 2; // don't care - normal_mode_timing.DataLatency = 2; // don't care - normal_mode_timing.DataHoldTime = 0; - normal_mode_timing.AccessMode = FMC_ACCESS_MODE_A; - - FMC_NORSRAM_TimingTypeDef ext_mode_timing = {0}; - ext_mode_timing.AddressSetupTime = 4; - ext_mode_timing.AddressHoldTime = 1; // don't care - ext_mode_timing.DataSetupTime = 5; - ext_mode_timing.BusTurnAroundDuration = 0; // don't care - ext_mode_timing.CLKDivision = 2; // don't care - ext_mode_timing.DataLatency = 2; // don't care - ext_mode_timing.DataHoldTime = 3; - ext_mode_timing.AccessMode = FMC_ACCESS_MODE_A; - - HAL_SRAM_Init(&external_display_data_sram, &normal_mode_timing, - &ext_mode_timing); - -#endif -} - -#ifdef FRAMEBUFFER -void display_setup_te_interrupt(void) { -#ifdef DISPLAY_TE_PIN - EXTI_HandleTypeDef EXTI_Handle = {0}; - EXTI_ConfigTypeDef EXTI_Config = {0}; - EXTI_Config.GPIOSel = DISPLAY_TE_INTERRUPT_GPIOSEL; - EXTI_Config.Line = DISPLAY_TE_INTERRUPT_EXTI_LINE; - EXTI_Config.Mode = EXTI_MODE_INTERRUPT; - EXTI_Config.Trigger = EXTI_TRIGGER_RISING; - HAL_EXTI_SetConfigLine(&EXTI_Handle, &EXTI_Config); - - // setup interrupt for tearing effect pin - NVIC_SetPriority(DISPLAY_TE_INTERRUPT_NUM, IRQ_PRI_NORMAL); -#endif -} -#endif - -void display_init_all(void) { - // init peripherals - __HAL_RCC_GPIOE_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOD_CLK_ENABLE(); - __HAL_RCC_FMC_CLK_ENABLE(); - - backlight_pwm_init(BACKLIGHT_RESET); - -#ifdef STM32F4 -#define DISPLAY_GPIO_SPEED GPIO_SPEED_FREQ_VERY_HIGH -#else -#define DISPLAY_GPIO_SPEED GPIO_SPEED_FREQ_LOW -#endif - - GPIO_InitTypeDef GPIO_InitStructure = {0}; - - // LCD_RST/PC14 - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Speed = DISPLAY_GPIO_SPEED; - GPIO_InitStructure.Alternate = 0; - GPIO_InitStructure.Pin = GPIO_PIN_14; - // default to keeping display in reset - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET); - HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); - -#ifdef DISPLAY_TE_PIN - // LCD_FMARK (tearing effect) - GPIO_InitStructure.Mode = GPIO_MODE_INPUT; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Speed = DISPLAY_GPIO_SPEED; - GPIO_InitStructure.Alternate = 0; - GPIO_InitStructure.Pin = DISPLAY_TE_PIN; - HAL_GPIO_Init(DISPLAY_TE_PORT, &GPIO_InitStructure); -#endif - - GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Speed = DISPLAY_GPIO_SPEED; - GPIO_InitStructure.Alternate = GPIO_AF12_FMC; - // LCD_CS/PD7 LCD_RS/PD11 LCD_RD/PD4 LCD_WR/PD5 - GPIO_InitStructure.Pin = GPIO_PIN_7 | GPIO_PIN_11 | GPIO_PIN_4 | GPIO_PIN_5; - HAL_GPIO_Init(GPIOD, &GPIO_InitStructure); - // LCD_D0/PD14 LCD_D1/PD15 LCD_D2/PD0 LCD_D3/PD1 - GPIO_InitStructure.Pin = GPIO_PIN_14 | GPIO_PIN_15 | GPIO_PIN_0 | GPIO_PIN_1; - HAL_GPIO_Init(GPIOD, &GPIO_InitStructure); - // LCD_D4/PE7 LCD_D5/PE8 LCD_D6/PE9 LCD_D7/PE10 - GPIO_InitStructure.Pin = GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10; - HAL_GPIO_Init(GPIOE, &GPIO_InitStructure); -#ifdef DISPLAY_I8080_16BIT_DW - // LCD_D8/PE11 LCD_D9/PE12 LCD_D10/PE13 LCD_D11/PE14 - GPIO_InitStructure.Pin = - GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14; - HAL_GPIO_Init(GPIOE, &GPIO_InitStructure); - // LCD_D12/PE15 - GPIO_InitStructure.Pin = GPIO_PIN_15; - HAL_GPIO_Init(GPIOE, &GPIO_InitStructure); - // LCD_D13/PD8 LCD_D14/PD9 LCD_D15/PD10 - GPIO_InitStructure.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10; - HAL_GPIO_Init(GPIOD, &GPIO_InitStructure); -#endif - - display_setup_fmc(); - - display_init_seq(); - - display_set_little_endian(); - - panel_set_window(0, 0, DISPLAY_RESX - 1, DISPLAY_RESY - 1); - -#ifdef FRAMEBUFFER - display_setup_te_interrupt(); -#endif -} - -void display_reinit(void) { - // reinitialize FMC to set correct timing, have to do this in reinit because - // boardloader is fixed. - display_setup_fmc(); - - // important for model T as this is not set in boardloader - display_set_little_endian(); - - backlight_pwm_init(BACKLIGHT_RETAIN); - -#ifdef TREZOR_MODEL_T - uint32_t id = display_identify(); - if (id == DISPLAY_ID_ST7789V && display_is_inverted()) { - // newest TT display - set proper gamma - lx154a2422_gamma(); - } else if (id == DISPLAY_ID_ST7789V) { - lx154a2411_gamma(); - } -#else - lx154a2482_init_seq(); -#endif - - DISPLAY_ORIENTATION = 0; - panel_set_window(0, 0, DISPLAY_RESX - 1, DISPLAY_RESY - 1); - -#ifdef FRAMEBUFFER - display_setup_te_interrupt(); -#endif -} - -void display_set_little_endian(void) { - uint32_t id = display_identify(); - if (id == DISPLAY_ID_GC9307) { - // CANNOT SET ENDIAN FOR GC9307 - } else if (id == DISPLAY_ID_ST7789V) { - CMD(0xB0); - DATA(0x00); - DATA(0xF8); - } else if (id == DISPLAY_ID_ILI9341V) { - // Interface Control: XOR BGR as ST7789V does - CMD(0xF6); - DATA(0x09); - DATA(0x30); - DATA(0x20); - } -} - -void display_set_big_endian(void) { - uint32_t id = display_identify(); - if (id == DISPLAY_ID_GC9307) { - // CANNOT SET ENDIAN FOR GC9307 - } else if (id == DISPLAY_ID_ST7789V) { - CMD(0xB0); - DATA(0x00); - DATA(0xF0); - } else if (id == DISPLAY_ID_ILI9341V) { - // Interface Control: XOR BGR as ST7789V does - CMD(0xF6); - DATA(0x09); - DATA(0x30); - DATA(0x00); - } -} - -const char *display_save(const char *prefix) { return NULL; } - -void display_clear_save(void) {} - -#ifdef FRAMEBUFFER - -void display_pixeldata(uint16_t c) { - uint16_t *address = 0; - - if (act_frame_buffer == 0) { - address = PhysFrameBuffer1; - } else { - address = PhysFrameBuffer0; - } - - /* Get the rectangle start address */ - address += cursor_y * DISPLAY_RESX + cursor_x; - - *address = c; - - cursor_x++; - if (cursor_x > window_x1) { - cursor_x = window_x0; - cursor_y++; - } - if (cursor_y > window_y1) { - cursor_y = window_y0; - } -} - -void display_sync(void) {} - -#ifndef BOARDLOADER -void DISPLAY_TE_INTERRUPT_HANDLER(void) { - NVIC_DisableIRQ(DISPLAY_TE_INTERRUPT_NUM); - - if (act_frame_buffer == 1) { - bg_copy_start_const_out_8((uint8_t *)PhysFrameBuffer1, - (uint8_t *)DISPLAY_DATA_ADDRESS, - DISPLAY_RESX * DISPLAY_RESY * 2, NULL); - - } else { - bg_copy_start_const_out_8((uint8_t *)PhysFrameBuffer0, - (uint8_t *)DISPLAY_DATA_ADDRESS, - DISPLAY_RESX * DISPLAY_RESY * 2, NULL); - } - - pending_fb_switch = false; - __HAL_GPIO_EXTI_CLEAR_FLAG(DISPLAY_TE_PIN); -} - -static void wait_for_fb_switch(void) { - while (pending_fb_switch) { - __WFI(); - } - bg_copy_wait(); -} -#endif - -static void copy_fb_to_display(uint16_t *fb) { - for (int i = 0; i < DISPLAY_RESX * DISPLAY_RESY; i++) { - // 2 bytes per pixel because we're using RGB 5-6-5 format - DATA_TRANSFER(fb[i]); - } -} - -static void switch_fb_manually(void) { - // sync with the panel refresh - while (GPIO_PIN_SET == HAL_GPIO_ReadPin(DISPLAY_TE_PORT, DISPLAY_TE_PIN)) { - } - while (GPIO_PIN_RESET == HAL_GPIO_ReadPin(DISPLAY_TE_PORT, DISPLAY_TE_PIN)) { - } - - if (act_frame_buffer == 0) { - act_frame_buffer = 1; - copy_fb_to_display(PhysFrameBuffer1); - memcpy(PhysFrameBuffer0, PhysFrameBuffer1, sizeof(PhysFrameBuffer1)); - - } else { - act_frame_buffer = 0; - copy_fb_to_display(PhysFrameBuffer0); - memcpy(PhysFrameBuffer1, PhysFrameBuffer0, sizeof(PhysFrameBuffer1)); - } -} - -#ifndef BOARDLOADER -static void switch_fb_in_backround(void) { - if (act_frame_buffer == 0) { - act_frame_buffer = 1; - - memcpy(PhysFrameBuffer0, PhysFrameBuffer1, sizeof(PhysFrameBuffer1)); - - pending_fb_switch = true; - __HAL_GPIO_EXTI_CLEAR_FLAG(DISPLAY_TE_PIN); - NVIC_EnableIRQ(DISPLAY_TE_INTERRUPT_NUM); - } else { - act_frame_buffer = 0; - memcpy(PhysFrameBuffer1, PhysFrameBuffer0, sizeof(PhysFrameBuffer1)); - - pending_fb_switch = true; - __HAL_GPIO_EXTI_CLEAR_FLAG(DISPLAY_TE_PIN); - NVIC_EnableIRQ(DISPLAY_TE_INTERRUPT_NUM); - } -} -#endif - -void display_refresh(void) { -#ifndef BOARDLOADER - wait_for_fb_switch(); - - if (is_mode_handler()) { - switch_fb_manually(); - } else { - switch_fb_in_backround(); - } -#else - switch_fb_manually(); -#endif -} - -void display_set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { - window_x0 = x0; - window_y0 = y0; - window_x1 = x1; - window_y1 = y1; - cursor_x = x0; - cursor_y = y0; -} - -uint8_t *display_get_wr_addr(void) { - uint32_t address = 0; - - if (act_frame_buffer == 0) { - address = (uint32_t)PhysFrameBuffer1; - } else { - address = (uint32_t)PhysFrameBuffer0; - } - - /* Get the rectangle start address */ - address = (address + (2 * (cursor_y * DISPLAY_RESX + cursor_x))); - - return (uint8_t *)address; -} - -uint32_t *display_get_fb_addr(void) { - uint32_t address = 0; - - if (act_frame_buffer == 0) { - address = (uint32_t)PhysFrameBuffer1; - } else { - address = (uint32_t)PhysFrameBuffer0; - } - - return (uint32_t *)address; -} -uint16_t display_get_window_width(void) { return window_x1 - window_x0 + 1; } - -uint16_t display_get_window_height(void) { return window_y1 - window_y0 + 1; } - -void display_shift_window(uint16_t pixels) { - uint16_t w = display_get_window_width(); - uint16_t h = display_get_window_height(); - - uint16_t line_rem = w - (cursor_x - window_x0); - - if (pixels < line_rem) { - cursor_x += pixels; - return; - } - - // start of next line - pixels = pixels - line_rem; - cursor_x = window_x0; - cursor_y++; - - // add the rest of pixels - cursor_y = window_y0 + (((cursor_y - window_y0) + (pixels / w)) % h); - cursor_x += pixels % w; -} - -uint16_t display_get_window_offset(void) { - return DISPLAY_RESX - display_get_window_width(); -} - -void display_efficient_clear(void) { - memzero(PhysFrameBuffer1, sizeof(PhysFrameBuffer1)); - memzero(PhysFrameBuffer0, sizeof(PhysFrameBuffer0)); -} - -void display_finish_actions(void) { -#ifndef BOARDLOADER - bg_copy_wait(); -#endif - backlight_pwm_deinit(BACKLIGHT_RETAIN); -} -#else -// NOT FRAMEBUFFER - -void display_pixeldata(uint16_t c) { PIXELDATA(c); } - -void display_set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { - panel_set_window(x0, y0, x1, y1); -} - -void display_sync(void) { -#ifdef DISPLAY_TE_PIN - uint32_t id = display_identify(); - if (id && (id != DISPLAY_ID_GC9307)) { - // synchronize with the panel synchronization signal - // in order to avoid visual tearing effects - while (GPIO_PIN_SET == HAL_GPIO_ReadPin(DISPLAY_TE_PORT, DISPLAY_TE_PIN)) - ; - while (GPIO_PIN_RESET == HAL_GPIO_ReadPin(DISPLAY_TE_PORT, DISPLAY_TE_PIN)) - ; - } -#endif -} - -void display_refresh(void) {} - -uint8_t *display_get_wr_addr(void) { return (uint8_t *)DISPLAY_DATA_ADDRESS; } - -uint16_t display_get_window_offset(void) { return 0; } - -void display_shift_window(uint16_t pixels) {} - -void display_finish_actions(void) { - backlight_pwm_deinit(BACKLIGHT_RETAIN); -#ifdef TREZOR_MODEL_T - display_set_big_endian(); -#endif -} - -#endif diff --git a/core/embed/trezorhal/stm32f4/displays/st7789v.h b/core/embed/trezorhal/stm32f4/displays/st7789v.h deleted file mode 100644 index 38851867de..0000000000 --- a/core/embed/trezorhal/stm32f4/displays/st7789v.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef _ST7789V_H -#define _ST7789V_H - -#include -#include - -typedef struct { - uint16_t x; - uint16_t y; -} display_padding_t; - -// ILI9341V, GC9307 and ST7789V drivers support 240px x 320px display resolution -#define MAX_DISPLAY_RESX 240 -#define MAX_DISPLAY_RESY 320 -#define DISPLAY_COLOR_MODE DMA2D_OUTPUT_RGB565 - -#ifdef DISPLAY_I8080_16BIT_DW -#define DISP_MEM_TYPE uint16_t -#elif DISPLAY_I8080_8BIT_DW -#define DISP_MEM_TYPE uint8_t -#else -#error "Unsupported display interface" -#endif - -#define DISP_MEM_TYPE uint8_t - -extern __IO DISP_MEM_TYPE *const DISPLAY_CMD_ADDRESS; -extern __IO DISP_MEM_TYPE *const DISPLAY_DATA_ADDRESS; - -#define CMD(X) (*DISPLAY_CMD_ADDRESS = (X)) -#define DATA(X) (*DISPLAY_DATA_ADDRESS = (X)) - -void display_set_little_endian(void); -void display_set_big_endian(void); -void display_set_slow_pwm(void); - -#ifdef FRAMEBUFFER -#define DISPLAY_FRAMEBUFFER_WIDTH DISPLAY_RESX -#define DISPLAY_FRAMEBUFFER_HEIGHT DISPLAY_RESY - -#define DISPLAY_EFFICIENT_CLEAR 1 - -static inline void display_pixel(uint8_t *fb, int16_t x, int16_t y, - uint16_t color) { - uint32_t p = 2 * (y * DISPLAY_FRAMEBUFFER_WIDTH + x); - *((uint16_t *)(fb + p)) = color; -} -void display_efficient_clear(void); - -#else - -#ifdef DISPLAY_I8080_16BIT_DW -#define PIXELDATA(X) DATA(X) -#elif DISPLAY_I8080_8BIT_DW -#define PIXELDATA(X) \ - DATA((X) & 0xFF); \ - DATA((X) >> 8) -#endif - -#endif - -#endif //_ST7789V_H diff --git a/core/embed/trezorhal/stm32f4/displays/ug-2828tswig01.c b/core/embed/trezorhal/stm32f4/displays/ug-2828tswig01.c deleted file mode 100644 index 18a1519065..0000000000 --- a/core/embed/trezorhal/stm32f4/displays/ug-2828tswig01.c +++ /dev/null @@ -1,372 +0,0 @@ -/* - * This file is part of the Trezor project, https://trezor.io/ - * - * Copyright (c) SatoshiLabs - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include - -#include "display.h" -#include "memzero.h" - -// FSMC/FMC Bank 1 - NOR/PSRAM 1 -#define DISPLAY_MEMORY_BASE 0x60000000 -#define DISPLAY_MEMORY_PIN 16 - -#define CMD(X) (*((__IO uint8_t *)((uint32_t)(DISPLAY_MEMORY_BASE))) = (X)) -#define ADDR \ - (*((__IO uint8_t *)((uint32_t)(DISPLAY_MEMORY_BASE | \ - (1 << DISPLAY_MEMORY_PIN))))) -#define DATA(X) (ADDR) = (X) - -static int DISPLAY_BACKLIGHT = -1; -static int DISPLAY_ORIENTATION = -1; -struct { - uint8_t RAM[DISPLAY_RESY / 8][DISPLAY_RESX]; - uint32_t row; - uint32_t col; - uint32_t window_x0; - uint32_t window_x1; - uint32_t window_y0; - uint32_t window_y1; -} DISPLAY_STATE; - -static void display_set_page_and_col(uint8_t page, uint8_t col) { - if (page < (DISPLAY_RESY / 8)) { - CMD(0xB0 | (page & 0xF)); - - if (col < DISPLAY_RESX) { - CMD(0x10 | ((col & 0x70) >> 4)); - CMD(0x00 | (col & 0x0F)); - } else { - // Reset column to start - CMD(0x10); - CMD(0x00); - } - } -} - -void display_pixeldata(uint16_t c) { - uint8_t data = DISPLAY_STATE.RAM[DISPLAY_STATE.row / 8][DISPLAY_STATE.col]; - - uint8_t bit = 1 << (DISPLAY_STATE.row % 8); - - // set to white if highest bits of all R, G, B values are set to 1 - // bin(10000 100000 10000) = hex(0x8410) - // otherwise set to black - if (c & 0x8410) { - data |= bit; - } else { - data &= ~bit; - } - - DISPLAY_STATE.RAM[DISPLAY_STATE.row / 8][DISPLAY_STATE.col] = data; - - DISPLAY_STATE.col++; - - if (DISPLAY_STATE.col > DISPLAY_STATE.window_x1) { - // next line - DISPLAY_STATE.col = DISPLAY_STATE.window_x0; - DISPLAY_STATE.row++; - - if (DISPLAY_STATE.row > DISPLAY_STATE.window_y1) { - // reached end of the window, go to start - DISPLAY_STATE.row = DISPLAY_STATE.window_y1; - } - - // set display to start of next line, sets also page, even if it stays on - // the same one - display_set_page_and_col(DISPLAY_STATE.row / 8, DISPLAY_STATE.col); - } -} - -void display_pixeldata_dirty(void) {} - -void display_reset_state(void) { - memzero(DISPLAY_STATE.RAM, sizeof(DISPLAY_STATE.RAM)); - DISPLAY_STATE.row = 0; - DISPLAY_STATE.col = 0; - DISPLAY_STATE.window_x0 = 0; - DISPLAY_STATE.window_x1 = DISPLAY_RESX - 1; - DISPLAY_STATE.window_y0 = 0; - DISPLAY_STATE.window_y1 = DISPLAY_RESY - 1; -} - -static void __attribute__((unused)) display_sleep(void) { - CMD(0xAE); // DISPOFF: Display Off - HAL_Delay(5); - HAL_GPIO_WritePin(GPIOD, GPIO_PIN_8, GPIO_PIN_RESET); // Vpp disable -} - -static void display_unsleep(void) { - HAL_GPIO_WritePin(GPIOD, GPIO_PIN_8, GPIO_PIN_SET); // Vpp enable - HAL_Delay(100); // 100 ms mandatory wait - CMD(0xAF); // Display ON -} - -void display_set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { - if (x1 >= DISPLAY_RESX) { - x1 = DISPLAY_RESX - 1; - } - if (y1 >= DISPLAY_RESY) { - y1 = DISPLAY_RESY - 1; - } - - if (x0 < DISPLAY_RESX && x1 < DISPLAY_RESX && x0 <= x1 && y0 < DISPLAY_RESY && - y1 < DISPLAY_RESY && y0 <= y1) { - DISPLAY_STATE.window_x0 = x0; - DISPLAY_STATE.window_x1 = x1; - DISPLAY_STATE.window_y0 = y0; - DISPLAY_STATE.window_y1 = y1; - DISPLAY_STATE.row = y0; - DISPLAY_STATE.col = x0; - - display_set_page_and_col(DISPLAY_STATE.row / 8, DISPLAY_STATE.col); - } -} - -int display_orientation(int degrees) { - if (degrees != DISPLAY_ORIENTATION) { - if (degrees == 0 || degrees == 180) { - DISPLAY_ORIENTATION = degrees; - if (degrees == 0) { - // Set Segment Re-map: (A0H - A1H) - CMD(0xA1); - // Set COM Output Scan Direction - CMD(0xC8); - } - if (degrees == 180) { - // Set Segment Re-map: (A0H - A1H) - CMD(0xA0); - // Set COM Output Scan Direction - CMD(0xC0); - } - } - } - - return DISPLAY_ORIENTATION; -} - -int display_get_orientation(void) { return DISPLAY_ORIENTATION; } - -int display_backlight(int val) { - if (DISPLAY_BACKLIGHT != val && val >= 0 && val <= 255) { - DISPLAY_BACKLIGHT = val; - // Set Contrast Control Register: (Double Bytes Command) - CMD(0x81); - CMD(val & 0xFF); - } - return DISPLAY_BACKLIGHT; -} - -static void send_init_seq_SH1107(void) { - // Display OFF - CMD(0xAE); - - // Set Display Clock Divide Ratio/Oscillator Frequency: (Double Bytes Command) - CMD(0xD5); - // Divide ratio 0, Oscillator Frequency +0% - CMD(0x50); - - // Set Memory Addressing Mode - page addressing mode - CMD(0x20); - - // Set Contrast Control Register: (Double Bytes Command) - CMD(0x81); - CMD(0x8F); - - // Set DC-DC Setting: (Double Bytes Command) - CMD(0xAD); - CMD(0x8A); - - // Set Segment Re-map: (A0H - A1H) - // CMD(0xA0); - CMD(0xA1); - - // Set COM Output Scan Direction - CMD(0xC8); - // CMD(0xC0); - - // Set Display Start Line:(Double Bytes Command) - CMD(0xDC); - CMD(0x00); - - // Set Display Offset:(Double Bytes Command) - CMD(0xD3); - CMD(0x00); - - // Set Discharge / Pre-Charge Period (Double Bytes Command) - CMD(0xD9); - CMD(0x22); - - // Set VCOM Deselect Level - CMD(0xDB); - CMD(0x35); - - // Set Multiplex Ratio - CMD(0xA8); - CMD(0x7F); - - // Set Page - CMD(0xB0); - // Set Column - CMD(0x00); - CMD(0x10); - - // Set Entire Display Off - // to be clear, this command turns of the function - // which turns entire display on, but it does not clear - // the data in display RAM - CMD(0xA4); - - // Set Normal Display - CMD(0xA6); - - HAL_GPIO_WritePin(GPIOD, GPIO_PIN_8, GPIO_PIN_SET); // Vpp enable - - // Vpp stabilization period - HAL_Delay(100); - - display_set_window(0, 0, MAX_DISPLAY_RESX - 1, MAX_DISPLAY_RESY - 1); - for (int i = 0; i < DISPLAY_RESY; i++) { - for (int j = 0; j < DISPLAY_RESX; j++) { - display_pixeldata(0); - } - } - - // Display ON - CMD(0xAF); -} - -void display_init_seq(void) { - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET); // LCD_RST/PC14 - // wait 10 milliseconds. only needs to be low for 10 microseconds. - // my dev display module ties display reset and touch panel reset together. - // keeping this low for max(display_reset_time, ctpm_reset_time) aids - // development and does not hurt. - HAL_Delay(10); - - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_SET); // LCD_RST/PC14 - // max wait time for hardware reset is 120 milliseconds - // (experienced display flakiness using only 5ms wait before sending commands) - HAL_Delay(120); - - send_init_seq_SH1107(); - - display_unsleep(); -} - -void display_init_all(void) { - // init peripherals - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOD_CLK_ENABLE(); - __HAL_RCC_GPIOE_CLK_ENABLE(); - __HAL_RCC_FMC_CLK_ENABLE(); - - GPIO_InitTypeDef GPIO_InitStructure = {0}; - - // LCD_RST/PC14 - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStructure.Alternate = 0; - GPIO_InitStructure.Pin = GPIO_PIN_14; - // default to keeping display in reset - HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET); - HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); - - // VPP Enable - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStructure.Pull = GPIO_PULLDOWN; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStructure.Alternate = 0; - GPIO_InitStructure.Pin = GPIO_PIN_8; - HAL_GPIO_WritePin(GPIOD, GPIO_PIN_8, GPIO_PIN_RESET); - HAL_GPIO_Init(GPIOD, &GPIO_InitStructure); - - GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStructure.Alternate = GPIO_AF12_FMC; - // LCD_CS/PD7 LCD_RS/PD11 LCD_RD/PD4 LCD_WR/PD5 - GPIO_InitStructure.Pin = GPIO_PIN_7 | GPIO_PIN_11 | GPIO_PIN_4 | GPIO_PIN_5; - HAL_GPIO_Init(GPIOD, &GPIO_InitStructure); - // LCD_D0/PD14 LCD_D1/PD15 LCD_D2/PD0 LCD_D3/PD1 - GPIO_InitStructure.Pin = GPIO_PIN_14 | GPIO_PIN_15 | GPIO_PIN_0 | GPIO_PIN_1; - HAL_GPIO_Init(GPIOD, &GPIO_InitStructure); - // LCD_D4/PE7 LCD_D5/PE8 LCD_D6/PE9 LCD_D7/PE10 - GPIO_InitStructure.Pin = GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10; - HAL_GPIO_Init(GPIOE, &GPIO_InitStructure); - - // Reference UM1725 "Description of STM32F4 HAL and LL drivers", - // section 64.2.1 "How to use this driver" - SRAM_HandleTypeDef external_display_data_sram = {0}; - external_display_data_sram.Instance = FMC_NORSRAM_DEVICE; - external_display_data_sram.Extended = FMC_NORSRAM_EXTENDED_DEVICE; - external_display_data_sram.Init.NSBank = FMC_NORSRAM_BANK1; - external_display_data_sram.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE; - external_display_data_sram.Init.MemoryType = FMC_MEMORY_TYPE_SRAM; - external_display_data_sram.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_8; - external_display_data_sram.Init.BurstAccessMode = - FMC_BURST_ACCESS_MODE_DISABLE; - external_display_data_sram.Init.WaitSignalPolarity = - FMC_WAIT_SIGNAL_POLARITY_LOW; - external_display_data_sram.Init.WrapMode = FMC_WRAP_MODE_DISABLE; - external_display_data_sram.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS; - external_display_data_sram.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE; - external_display_data_sram.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE; - external_display_data_sram.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE; - external_display_data_sram.Init.AsynchronousWait = - FMC_ASYNCHRONOUS_WAIT_DISABLE; - external_display_data_sram.Init.WriteBurst = FMC_WRITE_BURST_DISABLE; - external_display_data_sram.Init.ContinuousClock = - FMC_CONTINUOUS_CLOCK_SYNC_ONLY; - external_display_data_sram.Init.PageSize = FMC_PAGE_SIZE_NONE; - - // reference RM0090 section 37.5 Table 259, 37.5.4, Mode 1 SRAM, and 37.5.6 - FMC_NORSRAM_TimingTypeDef normal_mode_timing = {0}; - normal_mode_timing.AddressSetupTime = 10; - normal_mode_timing.AddressHoldTime = 10; - normal_mode_timing.DataSetupTime = 10; - normal_mode_timing.BusTurnAroundDuration = 0; - normal_mode_timing.CLKDivision = 2; - normal_mode_timing.DataLatency = 2; - normal_mode_timing.AccessMode = FMC_ACCESS_MODE_A; - - HAL_SRAM_Init(&external_display_data_sram, &normal_mode_timing, NULL); - - display_init_seq(); -} - -void display_sync(void) {} - -void display_refresh(void) { - for (int y = 0; y < (DISPLAY_RESY / 8); y++) { - display_set_page_and_col(y, 0); - for (int x = 0; x < DISPLAY_RESX; x++) { - DATA(DISPLAY_STATE.RAM[y][x]); - } - } -} - -void display_reinit(void) {} - -const char *display_save(const char *prefix) { return NULL; } - -void display_clear_save(void) {} - -void display_finish_actions(void) {} diff --git a/core/embed/trezorhal/stm32f4/displays/ug-2828tswig01.h b/core/embed/trezorhal/stm32f4/displays/ug-2828tswig01.h deleted file mode 100644 index 07978207fb..0000000000 --- a/core/embed/trezorhal/stm32f4/displays/ug-2828tswig01.h +++ /dev/null @@ -1,9 +0,0 @@ -#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 - -#endif //_UG_2828TSWIG01_H diff --git a/core/embed/trezorhal/stm32f4/displays/vg-2864ksweg01.c b/core/embed/trezorhal/stm32f4/displays/vg-2864ksweg01.c deleted file mode 100644 index c72173f217..0000000000 --- a/core/embed/trezorhal/stm32f4/displays/vg-2864ksweg01.c +++ /dev/null @@ -1,300 +0,0 @@ -/* - * This file is part of the Trezor project, https://trezor.io/ - * - * Copyright (c) SatoshiLabs - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include - -#include "display.h" - -#ifdef USE_CONSUMPTION_MASK -#include "consumption_mask.h" -#endif - -#define OLED_BUFSIZE (DISPLAY_RESX * DISPLAY_RESY / 8) -#define OLED_OFFSET(x, y) (OLED_BUFSIZE - 1 - (x) - ((y) / 8) * DISPLAY_RESX) -#define OLED_MASK(x, y) (1 << (7 - (y) % 8)) - -#define OLED_SETCONTRAST 0x81 -#define OLED_DISPLAYALLON_RESUME 0xA4 -#define OLED_DISPLAYALLON 0xA5 -#define OLED_NORMALDISPLAY 0xA6 -#define OLED_INVERTDISPLAY 0xA7 -#define OLED_DISPLAYOFF 0xAE -#define OLED_DISPLAYON 0xAF -#define OLED_SETDISPLAYOFFSET 0xD3 -#define OLED_SETCOMPINS 0xDA -#define OLED_SETVCOMDETECT 0xDB -#define OLED_SETDISPLAYCLOCKDIV 0xD5 -#define OLED_SETPRECHARGE 0xD9 -#define OLED_SETMULTIPLEX 0xA8 -#define OLED_SETLOWCOLUMN 0x00 -#define OLED_SETHIGHCOLUMN 0x10 -#define OLED_SETSTARTLINE 0x40 -#define OLED_MEMORYMODE 0x20 -#define OLED_COMSCANINC 0xC0 -#define OLED_COMSCANDEC 0xC8 -#define OLED_SEGREMAP 0xA0 -#define OLED_CHARGEPUMP 0x8D - -static int DISPLAY_BACKLIGHT = -1; -static int DISPLAY_ORIENTATION = -1; -static uint8_t OLED_BUFFER[OLED_BUFSIZE]; - -static struct { - struct { - uint16_t x, y; - } start; - struct { - uint16_t x, y; - } end; - struct { - uint16_t x, y; - } pos; -} PIXELWINDOW; - -static bool pixeldata_dirty_flag = true; - -void display_pixeldata(uint16_t c) { - if (PIXELWINDOW.pos.x <= PIXELWINDOW.end.x && - PIXELWINDOW.pos.y <= PIXELWINDOW.end.y) { - // set to white if highest bits of all R, G, B values are set to 1 - // bin(10000 100000 10000) = hex(0x8410) - // otherwise set to black - if (c & 0x8410) { - OLED_BUFFER[OLED_OFFSET(PIXELWINDOW.pos.x, PIXELWINDOW.pos.y)] |= - OLED_MASK(PIXELWINDOW.pos.x, PIXELWINDOW.pos.y); - } else { - OLED_BUFFER[OLED_OFFSET(PIXELWINDOW.pos.x, PIXELWINDOW.pos.y)] &= - ~OLED_MASK(PIXELWINDOW.pos.x, PIXELWINDOW.pos.y); - } - } - PIXELWINDOW.pos.x++; - if (PIXELWINDOW.pos.x > PIXELWINDOW.end.x) { - PIXELWINDOW.pos.x = PIXELWINDOW.start.x; - PIXELWINDOW.pos.y++; - } -} - -void display_reset_state() {} - -void display_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; - PIXELWINDOW.start.y = y0; - PIXELWINDOW.end.x = x1; - PIXELWINDOW.end.y = y1; - PIXELWINDOW.pos.x = x0; - PIXELWINDOW.pos.y = y0; -} - -int display_orientation(int degrees) { - if (degrees != DISPLAY_ORIENTATION) { - if (degrees == 0 || degrees == 180) { - DISPLAY_ORIENTATION = degrees; - display_refresh(); - } - } - return DISPLAY_ORIENTATION; -} - -int display_get_orientation(void) { return DISPLAY_ORIENTATION; } - -int display_backlight(int val) { - DISPLAY_BACKLIGHT = 255; - return DISPLAY_BACKLIGHT; -} - -SPI_HandleTypeDef spi_handle; - -static inline void spi_send(const uint8_t *data, int len) { - volatile int32_t timeout = 1000; - for (int i = 0; i < timeout; i++) - ; - - if (HAL_OK != HAL_SPI_Transmit(&spi_handle, (uint8_t *)data, len, 1000)) { - // TODO: error - return; - } - while (HAL_SPI_STATE_READY != HAL_SPI_GetState(&spi_handle)) { - } -} - -void display_handle_init(void) { - spi_handle.Instance = OLED_SPI; - spi_handle.State = HAL_SPI_STATE_RESET; - spi_handle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; - spi_handle.Init.Direction = SPI_DIRECTION_2LINES; - spi_handle.Init.CLKPhase = SPI_PHASE_1EDGE; - spi_handle.Init.CLKPolarity = SPI_POLARITY_LOW; - spi_handle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - spi_handle.Init.CRCPolynomial = 7; - spi_handle.Init.DataSize = SPI_DATASIZE_8BIT; - spi_handle.Init.FirstBit = SPI_FIRSTBIT_MSB; - spi_handle.Init.NSS = SPI_NSS_HARD_OUTPUT; - spi_handle.Init.TIMode = SPI_TIMODE_DISABLE; - spi_handle.Init.Mode = SPI_MODE_MASTER; -} - -void display_init_all(void) { - 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 = {0}; - - // set GPIO for OLED display - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStructure.Alternate = 0; - 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 = 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); - - display_handle_init(); - if (HAL_OK != HAL_SPI_Init(&spi_handle)) { - // TODO: error - return; - } - - // initialize display - - static const uint8_t s[25] = {OLED_DISPLAYOFF, - OLED_SETDISPLAYCLOCKDIV, - 0x80, - OLED_SETMULTIPLEX, - 0x3F, // 128x64 - OLED_SETDISPLAYOFFSET, - 0x00, - OLED_SETSTARTLINE | 0x00, - OLED_CHARGEPUMP, - 0x14, - OLED_MEMORYMODE, - 0x00, - OLED_SEGREMAP | 0x01, - OLED_COMSCANDEC, - OLED_SETCOMPINS, - 0x12, // 128x64 - OLED_SETCONTRAST, - 0xCF, - OLED_SETPRECHARGE, - 0xF1, - OLED_SETVCOMDETECT, - 0x40, - OLED_DISPLAYALLON_RESUME, - OLED_NORMALDISPLAY, - OLED_DISPLAYON}; - - HAL_GPIO_WritePin(OLED_DC_PORT, OLED_DC_PIN, GPIO_PIN_RESET); // set to CMD - HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_SET); // SPI deselect - - // Reset the LCD - HAL_GPIO_WritePin(OLED_RST_PORT, OLED_RST_PIN, GPIO_PIN_SET); - HAL_Delay(1); - HAL_GPIO_WritePin(OLED_RST_PORT, OLED_RST_PIN, GPIO_PIN_RESET); - HAL_Delay(1); - HAL_GPIO_WritePin(OLED_RST_PORT, OLED_RST_PIN, GPIO_PIN_SET); - - // init - HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_RESET); // SPI select - spi_send(s, 25); - HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_SET); // SPI deselect - - display_refresh(); -} - -void display_reinit(void) { - display_handle_init(); - HAL_SPI_Init(&spi_handle); -} - -static inline uint8_t reverse_byte(uint8_t b) { - b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; - b = (b & 0xCC) >> 2 | (b & 0x33) << 2; - b = (b & 0xAA) >> 1 | (b & 0x55) << 1; - return b; -} - -static void rotate_oled_buffer(void) { - for (int i = 0; i < OLED_BUFSIZE / 2; i++) { - uint8_t b = OLED_BUFFER[i]; - OLED_BUFFER[i] = reverse_byte(OLED_BUFFER[OLED_BUFSIZE - i - 1]); - OLED_BUFFER[OLED_BUFSIZE - i - 1] = reverse_byte(b); - } -} - -void display_sync(void) {} - -void display_refresh(void) { - static const uint8_t s[3] = {OLED_SETLOWCOLUMN | 0x00, - OLED_SETHIGHCOLUMN | 0x00, - OLED_SETSTARTLINE | 0x00}; - - if (!pixeldata_dirty_flag) { - return; - } - pixeldata_dirty_flag = false; - - HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_RESET); // SPI select - spi_send(s, 3); - -#if defined USE_CONSUMPTION_MASK && !defined BOARDLOADER - consumption_mask_randomize(); -#endif - - HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_SET); // SPI deselect - - HAL_GPIO_WritePin(OLED_DC_PORT, OLED_DC_PIN, GPIO_PIN_SET); // set to DATA - HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_RESET); // SPI select - if (DISPLAY_ORIENTATION == 180) { // rotate buffer if needed - rotate_oled_buffer(); - } - spi_send(OLED_BUFFER, OLED_BUFSIZE); - if (DISPLAY_ORIENTATION == 180) { // rotate buffer back to original position - rotate_oled_buffer(); - } - HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_SET); // SPI deselect - HAL_GPIO_WritePin(OLED_DC_PORT, OLED_DC_PIN, GPIO_PIN_RESET); // set to CMD -} - -const char *display_save(const char *prefix) { return NULL; } - -void display_clear_save(void) {} - -void display_finish_actions(void) {} diff --git a/core/embed/trezorhal/stm32f4/displays/vg-2864ksweg01.h b/core/embed/trezorhal/stm32f4/displays/vg-2864ksweg01.h deleted file mode 100644 index 34a592c593..0000000000 --- a/core/embed/trezorhal/stm32f4/displays/vg-2864ksweg01.h +++ /dev/null @@ -1,9 +0,0 @@ -#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 - -#endif //_VG_2864KSWEG01_H diff --git a/core/embed/trezorhal/stm32f4/dma2d.c b/core/embed/trezorhal/stm32f4/dma2d.c deleted file mode 100644 index 861eadd66a..0000000000 --- a/core/embed/trezorhal/stm32f4/dma2d.c +++ /dev/null @@ -1,174 +0,0 @@ -/* - * This file is part of the Trezor project, https://trezor.io/ - * - * Copyright (c) SatoshiLabs - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include - -#include "colors.h" -#include "display.h" -#include "dma2d.h" - -typedef enum { - DMA2D_LAYER_FG = 1, - DMA2D_LAYER_BG = 0, -} dma2d_layer_t; - -static DMA2D_HandleTypeDef dma2d_handle = {0}; -static uint16_t current_width = 0; -static uint16_t current_height = 0; - -void dma2d_init(void) { - __HAL_RCC_DMA2D_CLK_ENABLE(); - - dma2d_handle.Instance = (DMA2D_TypeDef*)DMA2D_BASE; - dma2d_handle.Init.ColorMode = DISPLAY_COLOR_MODE; - dma2d_handle.Init.OutputOffset = 0; -} - -static void dma2d_init_clut(uint16_t fg, uint16_t bg, dma2d_layer_t layer) { - volatile uint32_t* table = NULL; - if (layer == DMA2D_LAYER_BG) { - table = dma2d_handle.Instance->BGCLUT; - } else { - table = dma2d_handle.Instance->FGCLUT; - } - - uint32_t fg32 = rgb565_to_rgb888(fg); - uint32_t bg32 = rgb565_to_rgb888(bg); - - for (uint8_t i = 0; i < 16; i++) { - table[i] = interpolate_rgb888_color(fg32, bg32, i); - } - - DMA2D_CLUTCfgTypeDef clut = {0}; - clut.CLUTColorMode = DMA2D_CCM_ARGB8888; - clut.Size = 0xf; - clut.pCLUT = 0; // loading directly - - HAL_DMA2D_ConfigCLUT(&dma2d_handle, clut, layer); -} - -void dma2d_setup_const(void) { - dma2d_handle.Init.Mode = DMA2D_R2M; - dma2d_handle.Init.OutputOffset = display_get_window_offset(); - HAL_DMA2D_Init(&dma2d_handle); -} - -void dma2d_setup_4bpp(uint16_t fg_color, uint16_t bg_color) { - dma2d_handle.Init.Mode = DMA2D_M2M_PFC; - dma2d_handle.Init.OutputOffset = display_get_window_offset(); - dma2d_handle.LayerCfg[1].InputColorMode = DMA2D_INPUT_L4; - dma2d_handle.LayerCfg[1].InputOffset = 0; - dma2d_handle.LayerCfg[1].AlphaMode = 0; - dma2d_handle.LayerCfg[1].InputAlpha = 0; - - dma2d_init_clut(fg_color, bg_color, DMA2D_LAYER_FG); - - HAL_DMA2D_Init(&dma2d_handle); - HAL_DMA2D_ConfigLayer(&dma2d_handle, 1); -} - -void dma2d_setup_16bpp(void) { - dma2d_handle.Init.Mode = DMA2D_M2M_PFC; - dma2d_handle.Init.OutputOffset = display_get_window_offset(); - dma2d_handle.LayerCfg[1].InputColorMode = DMA2D_INPUT_RGB565; - dma2d_handle.LayerCfg[1].InputOffset = 0; - dma2d_handle.LayerCfg[1].AlphaMode = 0; - dma2d_handle.LayerCfg[1].InputAlpha = 0; - - HAL_DMA2D_Init(&dma2d_handle); - HAL_DMA2D_ConfigLayer(&dma2d_handle, 1); -} - -void dma2d_setup_4bpp_over_16bpp(uint16_t overlay_color) { - dma2d_handle.Init.Mode = DMA2D_M2M_BLEND; - dma2d_handle.Init.OutputOffset = display_get_window_offset(); - dma2d_handle.LayerCfg[1].InputColorMode = DMA2D_INPUT_A4; - dma2d_handle.LayerCfg[1].InputOffset = 0; - dma2d_handle.LayerCfg[1].AlphaMode = 0; - dma2d_handle.LayerCfg[1].InputAlpha = - 0xFF000000 | rgb565_to_rgb888(overlay_color); - - dma2d_handle.LayerCfg[0].InputColorMode = DMA2D_INPUT_RGB565; - dma2d_handle.LayerCfg[0].InputOffset = 0; - dma2d_handle.LayerCfg[0].AlphaMode = 0; - dma2d_handle.LayerCfg[0].InputAlpha = 0; - - HAL_DMA2D_Init(&dma2d_handle); - HAL_DMA2D_ConfigLayer(&dma2d_handle, 1); - HAL_DMA2D_ConfigLayer(&dma2d_handle, 0); -} - -void dma2d_setup_4bpp_over_4bpp(uint16_t fg_color, uint16_t bg_color, - uint16_t overlay_color) { - dma2d_handle.Init.Mode = DMA2D_M2M_BLEND; - dma2d_handle.Init.OutputOffset = display_get_window_offset(); - dma2d_handle.LayerCfg[1].InputColorMode = DMA2D_INPUT_A4; - dma2d_handle.LayerCfg[1].InputOffset = 0; - dma2d_handle.LayerCfg[1].AlphaMode = 0; - dma2d_handle.LayerCfg[1].InputAlpha = rgb565_to_rgb888(overlay_color); - - dma2d_handle.LayerCfg[0].InputColorMode = DMA2D_INPUT_L4; - dma2d_handle.LayerCfg[0].InputOffset = 0; - dma2d_handle.LayerCfg[0].AlphaMode = DMA2D_REPLACE_ALPHA; - dma2d_handle.LayerCfg[0].InputAlpha = 0xFF; - - dma2d_init_clut(fg_color, bg_color, DMA2D_LAYER_BG); - - HAL_DMA2D_Init(&dma2d_handle); - HAL_DMA2D_ConfigLayer(&dma2d_handle, 1); - HAL_DMA2D_ConfigLayer(&dma2d_handle, 0); -} - -void dma2d_start(uint8_t* in_addr, uint8_t* out_addr, int32_t pixels) { - current_width = pixels; - current_height = 1; - HAL_DMA2D_Start(&dma2d_handle, (uint32_t)in_addr, (uint32_t)out_addr, pixels, - 1); -} - -void dma2d_start_const(uint16_t color, uint8_t* out_addr, int32_t pixels) { - current_width = pixels; - current_height = 1; - HAL_DMA2D_Start(&dma2d_handle, rgb565_to_rgb888(color), (uint32_t)out_addr, - pixels, 1); -} - -void dma2d_start_const_multiline(uint16_t color, uint8_t* out_addr, - int32_t width, int32_t height) { - current_width = width; - current_height = height; - HAL_DMA2D_Start(&dma2d_handle, rgb565_to_rgb888(color), (uint32_t)out_addr, - width, height); -} - -void dma2d_start_blend(uint8_t* overlay_addr, uint8_t* bg_addr, - uint8_t* out_addr, int32_t pixels) { - current_width = pixels; - current_height = 1; - HAL_DMA2D_BlendingStart(&dma2d_handle, (uint32_t)overlay_addr, - (uint32_t)bg_addr, (uint32_t)out_addr, pixels, 1); -} - -void dma2d_wait_for_transfer(void) { - while (HAL_DMA2D_PollForTransfer(&dma2d_handle, 10) != HAL_OK) - ; - display_shift_window(current_width * current_height); - current_width = 0; - current_height = 0; -} diff --git a/core/embed/trezorhal/stm32f4/secret.c b/core/embed/trezorhal/stm32f4/secret.c index c2e6152e16..9485173147 100644 --- a/core/embed/trezorhal/stm32f4/secret.c +++ b/core/embed/trezorhal/stm32f4/secret.c @@ -1,7 +1,6 @@ #include #include -#include "display_draw.h" #include "flash.h" #include "mpu.h" #include "secret.h" diff --git a/core/embed/trezorhal/stm32f4/syscall_stubs.c b/core/embed/trezorhal/stm32f4/syscall_stubs.c index f20aeb7db8..0a6ca05184 100644 --- a/core/embed/trezorhal/stm32f4/syscall_stubs.c +++ b/core/embed/trezorhal/stm32f4/syscall_stubs.c @@ -101,7 +101,7 @@ void reboot_device(void) { } // ============================================================================= -// xdisplay.h +// display.h // ============================================================================= #include "display.h" diff --git a/core/embed/trezorhal/stm32f4/xdisplay/st-7789/display_driver.c b/core/embed/trezorhal/stm32f4/xdisplay/st-7789/display_driver.c index c2013f4b53..0596bbd8e7 100644 --- a/core/embed/trezorhal/stm32f4/xdisplay/st-7789/display_driver.c +++ b/core/embed/trezorhal/stm32f4/xdisplay/st-7789/display_driver.c @@ -19,7 +19,7 @@ #include -#include +#include #include "backlight_pwm.h" #include "display_fb.h" diff --git a/core/embed/trezorhal/stm32f4/xdisplay/st-7789/display_fb.c b/core/embed/trezorhal/stm32f4/xdisplay/st-7789/display_fb.c index 74bd79fa7f..2afb9c7494 100644 --- a/core/embed/trezorhal/stm32f4/xdisplay/st-7789/display_fb.c +++ b/core/embed/trezorhal/stm32f4/xdisplay/st-7789/display_fb.c @@ -18,13 +18,14 @@ */ #include +#include #include +#include "display.h" #include "display_fb.h" #include "display_internal.h" #include "display_io.h" #include "display_panel.h" -#include "xdisplay.h" #include "gfx_bitblt.h" #include "irq.h" @@ -189,18 +190,6 @@ bool display_get_frame_buffer(display_fb_info_t *fb) { state = drv->queue.entry[drv->queue.wix]; } while (state == FB_STATE_READY || state == FB_STATE_COPYING); - if (state == FB_STATE_EMPTY) { - // First use of this buffer, copy the previous buffer into it -#if (FRAME_BUFFER_COUNT > 1) -#ifndef NEW_RENDERING - uint8_t *src = get_fb_ptr((FRAME_BUFFER_COUNT + drv->queue.wix - 1) % - FRAME_BUFFER_COUNT); - uint8_t *dst = get_fb_ptr(drv->queue.wix); - memcpy(dst, src, PHYSICAL_FRAME_BUFFER_SIZE); -#endif -#endif - }; - drv->queue.entry[drv->queue.wix] = FB_STATE_PREPARING; fb->ptr = get_fb_ptr(drv->queue.wix); diff --git a/core/embed/trezorhal/stm32f4/xdisplay/st-7789/display_nofb.c b/core/embed/trezorhal/stm32f4/xdisplay/st-7789/display_nofb.c index 232566dd12..f8d38dac9a 100644 --- a/core/embed/trezorhal/stm32f4/xdisplay/st-7789/display_nofb.c +++ b/core/embed/trezorhal/stm32f4/xdisplay/st-7789/display_nofb.c @@ -20,7 +20,7 @@ #include #include -#include +#include #include "display_io.h" #include "display_panel.h" diff --git a/core/embed/trezorhal/stm32f4/xdisplay/stm32f429i-disc1/display_driver.c b/core/embed/trezorhal/stm32f4/xdisplay/stm32f429i-disc1/display_driver.c index 7a74431066..1a683e3603 100644 --- a/core/embed/trezorhal/stm32f4/xdisplay/stm32f429i-disc1/display_driver.c +++ b/core/embed/trezorhal/stm32f4/xdisplay/stm32f429i-disc1/display_driver.c @@ -18,14 +18,15 @@ */ #include +#include #include #ifdef KERNEL_MODE +#include "display.h" #include "display_internal.h" #include "ili9341_spi.h" #include "mpu.h" -#include "xdisplay.h" #if (DISPLAY_RESX != 240) || (DISPLAY_RESY != 320) #error "Incompatible display resolution" diff --git a/core/embed/trezorhal/stm32f4/xdisplay/stm32f429i-disc1/display_ltdc.c b/core/embed/trezorhal/stm32f4/xdisplay/stm32f429i-disc1/display_ltdc.c index 2d2fe7e62a..d0183de111 100644 --- a/core/embed/trezorhal/stm32f4/xdisplay/stm32f429i-disc1/display_ltdc.c +++ b/core/embed/trezorhal/stm32f4/xdisplay/stm32f429i-disc1/display_ltdc.c @@ -18,11 +18,12 @@ */ #include +#include #include +#include "display.h" #include "display_internal.h" #include "ili9341_spi.h" -#include "xdisplay.h" #define MAX_LAYER_NUMBER 2 diff --git a/core/embed/trezorhal/stm32f4/xdisplay/ug-2828/display_driver.c b/core/embed/trezorhal/stm32f4/xdisplay/ug-2828/display_driver.c index 768a4f3254..d90c003052 100644 --- a/core/embed/trezorhal/stm32f4/xdisplay/ug-2828/display_driver.c +++ b/core/embed/trezorhal/stm32f4/xdisplay/ug-2828/display_driver.c @@ -20,8 +20,8 @@ #include #include +#include "display.h" #include "mpu.h" -#include "xdisplay.h" #if (DISPLAY_RESX != 128) || (DISPLAY_RESY != 128) #error "Incompatible display resolution" diff --git a/core/embed/trezorhal/stm32f4/xdisplay/vg-2864/display_driver.c b/core/embed/trezorhal/stm32f4/xdisplay/vg-2864/display_driver.c index 08ea87c00b..b1f18468e6 100644 --- a/core/embed/trezorhal/stm32f4/xdisplay/vg-2864/display_driver.c +++ b/core/embed/trezorhal/stm32f4/xdisplay/vg-2864/display_driver.c @@ -18,12 +18,13 @@ */ #include +#include #include +#include "display.h" #include "mpu.h" #include "sizedefs.h" #include "trustzone.h" -#include "xdisplay.h" #ifdef USE_CONSUMPTION_MASK #include "consumption_mask.h" diff --git a/core/embed/trezorhal/stm32u5/displays/dsi.c b/core/embed/trezorhal/stm32u5/displays/dsi.c deleted file mode 100644 index 5734a3f2e4..0000000000 --- a/core/embed/trezorhal/stm32u5/displays/dsi.c +++ /dev/null @@ -1,1724 +0,0 @@ -/** - ****************************************************************************** - * @file stm32u5x9j_discovery_lcd.c - * @author MCD Application Team - * @brief This file includes the driver for Liquid Crystal Display (LCD) - module - * mounted on MB1829A board (ARGB8888 color format). - @verbatim - 1. How To use this driver: - -------------------------- - - This driver is used to drive directly in command mode a LCD TFT using the - DSI interface. - The following IPs are implied : DSI Host IP block working - in conjunction to the LTDC controller. - - This driver is linked by construction to LCD. - - 2. Driver description: - ---------------------- - + Initialization steps: - o Initialize the LCD using the BSP_LCD_Init() function. You can select - display orientation with "Orientation" parameter (portrait, landscape, - portrait with 180 degrees rotation or landscape with 180 degrees - rotation). - o Call BSP_LCD_GetXSize() and BSP_LCD_GetYsize() to get respectively - width and height in pixels of LCD in the current orientation. - o Call BSP_LCD_SetBrightness() and BSP_LCD_GetBrightness() to - respectively set and get LCD brightness. - o Call BSP_LCD_SetActiveLayer() to select the current active layer. - o Call BSP_LCD_GetFormat() to get LCD pixel format supported. - - + Display on LCD: - o Call BSP_LCD_DisplayOn() and BSP_LCD_DisplayOff() to respectively - switch on and switch off the LCD display. - o First, check that frame buffer is available using - BSP_LCD_IsFrameBufferAvailable(). o When frame buffer is available, modify it - using following functions: o Call BSP_LCD_WritePixel() and BSP_LCD_ReadPixel() - to respectively write and read a pixel. o Call BSP_LCD_DrawHLine() to draw a - horizontal line. o Call BSP_LCD_DrawVLine() to draw a vertical line. o Call - BSP_LCD_DrawBitmap() to draw a bitmap. o Call BSP_LCD_FillRect() to draw a - rectangle. o Call BSP_LCD_FillRGBRect() to draw a rectangle with RGB buffer. - o Call BSP_LCD_Refresh() to refresh LCD display. - - + De-initialization steps: - o De-initialize the LCD using the BSP_LCD_DeInit() function. - - @endverbatim - ****************************************************************************** - * @attention - * - * Copyright (c) 2023 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include -#include - -#include "colors.h" -#include "irq.h" - -/* Common Error codes */ -#define BSP_ERROR_NONE 0 -#define BSP_ERROR_NO_INIT -1 -#define BSP_ERROR_WRONG_PARAM -2 -#define BSP_ERROR_BUSY -3 -#define BSP_ERROR_PERIPH_FAILURE -4 -#define BSP_ERROR_COMPONENT_FAILURE -5 -#define BSP_ERROR_UNKNOWN_FAILURE -6 -#define BSP_ERROR_UNKNOWN_COMPONENT -7 -#define BSP_ERROR_BUS_FAILURE -8 -#define BSP_ERROR_CLOCK_FAILURE -9 -#define BSP_ERROR_MSP_FAILURE -10 -#define BSP_ERROR_FEATURE_NOT_SUPPORTED -11 - -#define BSP_ERROR_BUS_ACKNOWLEDGE_FAILURE (-102) -/* Button user interrupt priority */ -#define BSP_BUTTON_USER_IT_PRIORITY \ - 0x0FUL /* Default is lowest priority level */ - -#define LCD_PIXEL_FORMAT_ARGB8888 \ - 0x00000000U /*!< ARGB8888 LTDC pixel format \ - */ -#define LCD_PIXEL_FORMAT_RGB888 0x00000001U /*!< RGB888 LTDC pixel format */ -#define LCD_PIXEL_FORMAT_RGB565 0x00000002U /*!< RGB565 LTDC pixel format */ -#define LCD_PIXEL_FORMAT_ARGB1555 \ - 0x00000003U /*!< ARGB1555 LTDC pixel format \ - */ -#define LCD_PIXEL_FORMAT_ARGB4444 \ - 0x00000004U /*!< ARGB4444 LTDC pixel format \ - */ -#define LCD_PIXEL_FORMAT_L8 0x00000005U /*!< L8 LTDC pixel format */ -#define LCD_PIXEL_FORMAT_AL44 0x00000006U /*!< AL44 LTDC pixel format */ -#define LCD_PIXEL_FORMAT_AL88 0x00000007U /*!< AL88 LTDC pixel format */ -/* LCD instances */ -#define LCD_INSTANCES_NBR 1U - -/* LCD orientations */ -#define LCD_ORIENTATION_PORTRAIT 0U -#define LCD_ORIENTATION_LANDSCAPE 1U -#define LCD_ORIENTATION_PORTRAIT_ROT180 2U -#define LCD_ORIENTATION_LANDSCAPE_ROT180 3U - -#define DSI_POWERON_GPIO_PORT GPIOI -#define DSI_POWERON_GPIO_PIN GPIO_PIN_5 -#define DSI_POWERON_GPIO_CLOCK_ENABLE() __HAL_RCC_GPIOI_CLK_ENABLE() - -#define DSI_RESET_GPIO_PORT GPIOD -#define DSI_RESET_GPIO_PIN GPIO_PIN_5 -#define DSI_RESET_GPIO_CLOCK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE() - -#define VSYNC 1 -#define VBP 12 -#define VFP 50 -#define VACT 481 -#define HSYNC 2 -#define HBP 1 -#define HFP 1 -#define HACT 480 -#define LCD_WIDTH 480 -#define LCD_HEIGHT 480 - -#define PIXEL_PER_LINE 768U -#define BYTE_PER_PIXEL 4U /* ARGB8888 */ - -#include "gfxmmu_lut.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32U5x9J_DISCOVERY - * @{ - */ - -/** @defgroup STM32U5x9J_DISCOVERY_LCD LCD - * @{ - */ - -/** @defgroup STM32U5x9J_DISCOVERY_LCD_Private_Defines LCD Private Constants - * @{ - */ - -/** - * @} - */ - -/** @defgroup STM32U5x9J_DISCOVERY_LCD_Private_Variables LCD Private Variables - * @{ - */ - -__attribute__((section(".fb1"))) -ALIGN_32BYTES(uint32_t PhysFrameBuffer0[184320]); -__attribute__((section(".fb2"))) -ALIGN_32BYTES(uint32_t PhysFrameBuffer1[184320]); - -__attribute__((section(".gfxmmu_table"))) -uint32_t gfxmmu_lut[2 * GFXMMU_LUT_SIZE]; -__attribute__((section(".framebuffer_select"))) uint32_t act_frame_buffer = 0; - -#if (USE_HAL_GFXMMU_REGISTER_CALLBACKS == 1) -static uint32_t LcdGfxmmu_IsMspCbValid[LCD_INSTANCES_NBR] = {0}; -#endif /* (USE_HAL_GFXMMU_REGISTER_CALLBACKS == 1) */ - -#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) -static uint32_t LcdLtdc_IsMspCbValid[LCD_INSTANCES_NBR] = {0}; -#endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */ - -#if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) -static uint32_t LcdDsi_IsMspCbValid[LCD_INSTANCES_NBR] = {0}; -#endif /* (USE_HAL_DSI_REGISTER_CALLBACKS == 1) */ - -GFXMMU_HandleTypeDef hlcd_gfxmmu = {0}; -LTDC_HandleTypeDef hlcd_ltdc = {0}; -DSI_HandleTypeDef hlcd_dsi = {0}; -static DSI_VidCfgTypeDef DSIVidCfg = {0}; - -uint16_t window_x0 = 0; -uint16_t window_y0 = 0; -uint16_t window_x1 = 0; -uint16_t window_y1 = 0; -uint16_t cursor_x = 0; -uint16_t cursor_y = 0; - -/** - * @} - */ - -/** @defgroup STM32U5x9J_DISCOVERY_LCD_Private_FunctionPrototypes LCD Private - * Function Prototypes - * @{ - */ -static int32_t LCD_Init(void); -static int32_t LCD_DeInit(void); - -static void GFXMMU_MspInit(GFXMMU_HandleTypeDef *hgfxmmu); -static void GFXMMU_MspDeInit(GFXMMU_HandleTypeDef *hgfxmmu); -static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc); -static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc); -static void DSI_MspInit(DSI_HandleTypeDef *hdsi); -static void DSI_MspDeInit(DSI_HandleTypeDef *hdsi); -#if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) -static void DSI_EndOfRefreshCallback(DSI_HandleTypeDef *hdsi); -#endif /* (USE_HAL_DSI_REGISTER_CALLBACKS == 1) */ -/** - * @} - */ - -/** @addtogroup STM32U5x9J_DISCOVERY_LCD_Exported_Functions - * @{ - */ -/** - * @brief Initialize the LCD. - * @param Instance LCD Instance. - * @param Orientation LCD_ORIENTATION_PORTRAIT, LCD_ORIENTATION_LANDSCAPE, - * LCD_ORIENTATION_PORTRAIT_ROT180 or - * LCD_ORIENTATION_LANDSCAPE_ROT180. - * @retval BSP status. - */ -int32_t BSP_LCD_Init(uint32_t Instance, uint32_t Orientation) { - int32_t status = BSP_ERROR_NONE; - - if ((Instance >= LCD_INSTANCES_NBR) || - (Orientation > LCD_ORIENTATION_LANDSCAPE_ROT180)) { - status = BSP_ERROR_WRONG_PARAM; - } else if ((Orientation == LCD_ORIENTATION_LANDSCAPE) || - (Orientation == LCD_ORIENTATION_LANDSCAPE_ROT180)) { - status = BSP_ERROR_FEATURE_NOT_SUPPORTED; - } else { - if (LCD_Init() != 0) { - status = BSP_ERROR_PERIPH_FAILURE; - } - } - - return status; -} - -/** - * @brief De-Initialize the LCD. - * @param Instance LCD Instance. - * @retval BSP status. - */ -int32_t BSP_LCD_DeInit(uint32_t Instance) { - int32_t status = BSP_ERROR_NONE; - - if (Instance >= LCD_INSTANCES_NBR) { - status = BSP_ERROR_WRONG_PARAM; - } else { - if (LCD_DeInit() != 0) { - status = BSP_ERROR_PERIPH_FAILURE; - } - } - - return status; -} - -/** - * @brief Set the display on. - * @param Instance LCD Instance. - * @retval BSP status. - */ -int32_t BSP_LCD_DisplayOn(uint32_t Instance) { - int32_t status = BSP_ERROR_NONE; - - if (Instance >= LCD_INSTANCES_NBR) { - status = BSP_ERROR_WRONG_PARAM; - } else { - /* Set the display on */ - if (HAL_DSI_ShortWrite(&hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, - DSI_SET_DISPLAY_ON, 0x00) != HAL_OK) { - status = BSP_ERROR_WRONG_PARAM; - } - } - - return status; -} - -/** - * @brief Set the display off. - * @param Instance LCD Instance. - * @retval BSP status. - */ -int32_t BSP_LCD_DisplayOff(uint32_t Instance) { - int32_t status = BSP_ERROR_NONE; - - if (Instance >= LCD_INSTANCES_NBR) { - status = BSP_ERROR_WRONG_PARAM; - } else { - /* Set the display off */ - if (HAL_DSI_ShortWrite(&hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, - DSI_SET_DISPLAY_OFF, 0x00) != HAL_OK) { - status = BSP_ERROR_WRONG_PARAM; - } - } - - return status; -} - -/** - * @brief Set the display brightness. - * @param Instance LCD Instance. - * @param Brightness [00: Min (black), 100 Max]. - * @retval BSP status. - */ -int32_t BSP_LCD_SetBrightness(uint32_t Instance, uint32_t Brightness) { - int32_t status; - - if ((Instance >= LCD_INSTANCES_NBR) || (Brightness > 100U)) { - status = BSP_ERROR_WRONG_PARAM; - } else { - status = BSP_ERROR_FEATURE_NOT_SUPPORTED; - } - - return status; -} - -/** - * @brief Get the display brightness. - * @param Instance LCD Instance. - * @param Brightness [00: Min (black), 100 Max]. - * @retval BSP status. - */ -int32_t BSP_LCD_GetBrightness(uint32_t Instance, uint32_t *Brightness) { - int32_t status; - - if ((Instance >= LCD_INSTANCES_NBR) || (Brightness == NULL)) { - status = BSP_ERROR_WRONG_PARAM; - } else { - status = BSP_ERROR_FEATURE_NOT_SUPPORTED; - } - - return status; -} - -/** - * @brief Get the LCD X size. - * @param Instance LCD Instance. - * @param Xsize LCD X size. - * @retval BSP status. - */ -int32_t BSP_LCD_GetXSize(uint32_t Instance, uint32_t *Xsize) { - int32_t status = BSP_ERROR_NONE; - - if ((Instance >= LCD_INSTANCES_NBR) || (Xsize == NULL)) { - status = BSP_ERROR_WRONG_PARAM; - } else { - /* Get the display Xsize */ - *Xsize = LCD_WIDTH; - } - - return status; -} - -/** - * @brief Get the LCD Y size. - * @param Instance LCD Instance. - * @param Ysize LCD Y size. - * @retval BSP status. - */ -int32_t BSP_LCD_GetYSize(uint32_t Instance, uint32_t *Ysize) { - int32_t status = BSP_ERROR_NONE; - - if ((Instance >= LCD_INSTANCES_NBR) || (Ysize == NULL)) { - status = BSP_ERROR_WRONG_PARAM; - } else { - /* Get the display Ysize */ - *Ysize = LCD_HEIGHT; - } - - return status; -} - -/** - * @brief Set the LCD active layer. - * @param Instance LCD Instance. - * @param LayerIndex Active layer index. - * @retval BSP status. - */ -int32_t BSP_LCD_SetActiveLayer(uint32_t Instance, uint32_t LayerIndex) { - int32_t status = BSP_ERROR_NONE; - - if (Instance >= LCD_INSTANCES_NBR) { - status = BSP_ERROR_WRONG_PARAM; - } else { - /* Nothing to do */ - UNUSED(LayerIndex); - } - - return status; -} - -/** - * @brief Get pixel format supported by LCD. - * @param Instance LCD Instance. - * @param Format Pointer on pixel format. - * @retval BSP status. - */ -int32_t BSP_LCD_GetFormat(uint32_t Instance, uint32_t *Format) { - int32_t status = BSP_ERROR_NONE; - - if (Instance >= LCD_INSTANCES_NBR) { - status = BSP_ERROR_WRONG_PARAM; - } else { - /* Get pixel format supported by LCD */ - *Format = LCD_PIXEL_FORMAT_ARGB8888; - } - - return status; -} - -void MX_GFXMMU_Reinit(GFXMMU_HandleTypeDef *hgfxmmu) { - /* Initialize GFXMMU */ - hgfxmmu->Instance = GFXMMU; - hgfxmmu->Init.BlocksPerLine = GFXMMU_192BLOCKS; - hgfxmmu->Init.DefaultValue = 0xFFFFFFFFU; - hgfxmmu->Init.Buffers.Buf0Address = (uint32_t)PhysFrameBuffer0; - hgfxmmu->Init.Buffers.Buf1Address = (uint32_t)PhysFrameBuffer1; - hgfxmmu->Init.Buffers.Buf2Address = 0; - hgfxmmu->Init.Buffers.Buf3Address = 0; -#if defined(GFXMMU_CR_CE) - hgfxmmu->Init.CachePrefetch.Activation = DISABLE; - hgfxmmu->Init.CachePrefetch.CacheLock = GFXMMU_CACHE_LOCK_DISABLE; - hgfxmmu->Init.CachePrefetch.CacheLockBuffer = - GFXMMU_CACHE_LOCK_BUFFER0; /* NU */ - hgfxmmu->Init.CachePrefetch.CacheForce = GFXMMU_CACHE_FORCE_ENABLE; /* NU */ - hgfxmmu->Init.CachePrefetch.OutterBufferability = - GFXMMU_OUTTER_BUFFERABILITY_DISABLE; - hgfxmmu->Init.CachePrefetch.OutterCachability = - GFXMMU_OUTTER_CACHABILITY_DISABLE; - hgfxmmu->Init.CachePrefetch.Prefetch = GFXMMU_PREFETCH_DISABLE; -#endif /* GFXMMU_CR_CE */ -#if defined(GFXMMU_CR_ACE) - hgfxmmu->Init.AddressCache.Activation = DISABLE; - hgfxmmu->Init.AddressCache.AddressCacheLockBuffer = - GFXMMU_ADDRESSCACHE_LOCK_BUFFER0; -#endif /* GFXMMU_CR_ACE */ - hgfxmmu->Init.Interrupts.Activation = DISABLE; - hgfxmmu->Init.Interrupts.UsedInterrupts = GFXMMU_AHB_MASTER_ERROR_IT; /* NU */ -} - -/** - * @brief MX GFXMMU initialization. - * @param hgfxmmu GFXMMU handle. - * @retval HAL status. - */ -__weak HAL_StatusTypeDef MX_GFXMMU_Init(GFXMMU_HandleTypeDef *hgfxmmu) { - MX_GFXMMU_Reinit(hgfxmmu); - return HAL_GFXMMU_Init(hgfxmmu); -} - -/** - * @brief MX LTDC clock configuration. - * @param hltdc LTDC handle. - * @retval HAL status. - */ -__weak HAL_StatusTypeDef MX_LTDC_ClockConfig(LTDC_HandleTypeDef *hltdc) { - RCC_PeriphCLKInitTypeDef PLL3InitPeriph = {0}; - - /* Prevent unused argument(s) compilation warning */ - UNUSED(hltdc); - - /* Start and configurre PLL3 */ - /* HSE = 16MHZ */ - /* 16/(M=4) = 4MHz input (min) */ - /* 4*(N=125) = 500MHz VCO (almost max) */ - /* 500/(P=8) = 62.5 for DSI ie exactly the lane byte clock*/ - /* 500/(R=24) = 20.83 for LTDC exact match with DSI bandwidth */ - PLL3InitPeriph.PeriphClockSelection = RCC_PERIPHCLK_LTDC; - PLL3InitPeriph.LtdcClockSelection = RCC_LTDCCLKSOURCE_PLL3; - PLL3InitPeriph.PLL3.PLL3M = 4; - PLL3InitPeriph.PLL3.PLL3N = 125; - PLL3InitPeriph.PLL3.PLL3P = 8; - PLL3InitPeriph.PLL3.PLL3Q = 8; - PLL3InitPeriph.PLL3.PLL3R = 24; - PLL3InitPeriph.PLL3.PLL3FRACN = 0; - PLL3InitPeriph.PLL3.PLL3RGE = RCC_PLLVCIRANGE_1; - PLL3InitPeriph.PLL3.PLL3ClockOut = RCC_PLL3_DIVR | RCC_PLL3_DIVP; - PLL3InitPeriph.PLL3.PLL3Source = RCC_PLLSOURCE_HSE; - return HAL_RCCEx_PeriphCLKConfig(&PLL3InitPeriph); -} - -void MX_LTDC_Reinit(LTDC_HandleTypeDef *hltdc) { - /* LTDC initialization */ - hltdc->Instance = LTDC; - hltdc->Init.HSPolarity = LTDC_HSPOLARITY_AL; - hltdc->Init.VSPolarity = LTDC_VSPOLARITY_AL; - hltdc->Init.DEPolarity = LTDC_DEPOLARITY_AL; - hltdc->Init.PCPolarity = LTDC_PCPOLARITY_IPC; - hltdc->Init.HorizontalSync = HSYNC - 1; - hltdc->Init.AccumulatedHBP = HSYNC + HBP - 1; - hltdc->Init.AccumulatedActiveW = HACT + HBP + HSYNC - 1; - hltdc->Init.TotalWidth = HACT + HBP + HFP + HSYNC - 1; - hltdc->Init.Backcolor.Red = 0; /* Not used default value */ - hltdc->Init.Backcolor.Green = 0; /* Not used default value */ - hltdc->Init.Backcolor.Blue = 0; /* Not used default value */ - hltdc->Init.Backcolor.Reserved = 0xFF; - - HAL_LTDCEx_StructInitFromVideoConfig(&hlcd_ltdc, &DSIVidCfg); -} - -/** - * @brief MX LTDC initialization. - * @param hltdc LTDC handle. - * @retval HAL status. - */ -__weak HAL_StatusTypeDef MX_LTDC_Init(LTDC_HandleTypeDef *hltdc) { - MX_LTDC_Reinit(hltdc); - - return HAL_LTDC_Init(hltdc); -} - -// HAL_StatusTypeDef MX_LTDC_ReConfigLayer(LTDC_HandleTypeDef *hltdc, uint32_t -// LayerIndex) -//{ -// LTDC_LayerCfgTypeDef LayerCfg = {0}; -// -///* LTDC layer configuration */ -// LayerCfg.WindowX0 = 0; -// LayerCfg.WindowX1 = LCD_WIDTH; -// LayerCfg.WindowY0 = 1; -// LayerCfg.WindowY1 = (uint32_t)LCD_HEIGHT + 1UL; -// LayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888; -// LayerCfg.Alpha = 0xFF; /* NU default value */ -// LayerCfg.Alpha0 = 0; /* NU default value */ -// LayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA; /* Not Used: default -// value */ LayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA; /* Not -// Used: default value */ LayerCfg.FBStartAdress = -// GFXMMU_VIRTUAL_BUFFER0_BASE; LayerCfg.ImageWidth = PIXEL_PER_LINE; /* -// Number of pixels per line in virtual frame buffer */ LayerCfg.ImageHeight = -// LCD_HEIGHT; LayerCfg.Backcolor.Red = 0; /* Not Used: default value */ -// LayerCfg.Backcolor.Green = 0; /* Not Used: default value */ -// LayerCfg.Backcolor.Blue = 0; /* Not Used: default value */ -// LayerCfg.Bac -// return HAL_LTDC_ConfigLayer(hltdc, &LayerCfg, LayerIndex);kcolor.Reserved = -// 0xFF; -//} - -/** - * @brief MX LTDC layer configuration. - * @param hltdc LTDC handle. - * @param LayerIndex LTDC layer index. - * @retval HAL status. - */ -__weak HAL_StatusTypeDef MX_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, - uint32_t LayerIndex, - uint32_t fb_addr) { - LTDC_LayerCfgTypeDef LayerCfg = {0}; - - /* LTDC layer configuration */ - LayerCfg.WindowX0 = 0; - LayerCfg.WindowX1 = LCD_WIDTH; - LayerCfg.WindowY0 = 1; - LayerCfg.WindowY1 = (uint32_t)LCD_HEIGHT + 1UL; - LayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888; - LayerCfg.Alpha = 0xFF; /* NU default value */ - LayerCfg.Alpha0 = 0; /* NU default value */ - LayerCfg.BlendingFactor1 = - LTDC_BLENDING_FACTOR1_PAxCA; /* Not Used: default value */ - LayerCfg.BlendingFactor2 = - LTDC_BLENDING_FACTOR2_PAxCA; /* Not Used: default value */ - LayerCfg.FBStartAdress = fb_addr; - LayerCfg.ImageWidth = - PIXEL_PER_LINE; /* Number of pixels per line in virtual frame buffer */ - LayerCfg.ImageHeight = LCD_HEIGHT; - LayerCfg.Backcolor.Red = 0; /* Not Used: default value */ - LayerCfg.Backcolor.Green = 0; /* Not Used: default value */ - LayerCfg.Backcolor.Blue = 0; /* Not Used: default value */ - LayerCfg.Backcolor.Reserved = 0xFF; - return HAL_LTDC_ConfigLayer(hltdc, &LayerCfg, LayerIndex); -} - -/** - * @brief MX DSI initialization. - * @param hdsi DSI handle. - * @retval HAL status. - */ -HAL_StatusTypeDef MX_DSI_Reinit(DSI_HandleTypeDef *hdsi) { - /* DSI initialization */ - hdsi->Instance = DSI; - hdsi->Init.AutomaticClockLaneControl = DSI_AUTO_CLK_LANE_CTRL_DISABLE; - /* We have 1 data lane at 500Mbps => lane byte clock at 500/8 = 62,5 MHZ */ - /* We want TX escape clock at around 20MHz and under 20MHz so clock division - * is set to 4 */ - hdsi->Init.TXEscapeCkdiv = 4; - hdsi->Init.NumberOfLanes = DSI_TWO_DATA_LANES; - hdsi->Init.PHYFrequencyRange = DSI_DPHY_FRANGE_450MHZ_510MHZ; - hdsi->Init.PHYLowPowerOffset = 0; - - /* Configure the DSI for Video mode */ - DSIVidCfg.VirtualChannelID = 0; - DSIVidCfg.HSPolarity = DSI_HSYNC_ACTIVE_HIGH; - DSIVidCfg.VSPolarity = DSI_VSYNC_ACTIVE_HIGH; - DSIVidCfg.DEPolarity = DSI_DATA_ENABLE_ACTIVE_HIGH; - DSIVidCfg.ColorCoding = DSI_RGB888; - DSIVidCfg.Mode = DSI_VID_MODE_BURST; - DSIVidCfg.PacketSize = LCD_WIDTH; - DSIVidCfg.NullPacketSize = 0xFFFU; - DSIVidCfg.HorizontalSyncActive = HSYNC * 3; - DSIVidCfg.HorizontalBackPorch = HBP * 3; - DSIVidCfg.HorizontalLine = (HACT + HSYNC + HBP + HFP) * 3; - DSIVidCfg.VerticalSyncActive = VSYNC; - DSIVidCfg.VerticalBackPorch = VBP; - DSIVidCfg.VerticalFrontPorch = VFP; - DSIVidCfg.VerticalActive = VACT; - DSIVidCfg.LPCommandEnable = DSI_LP_COMMAND_ENABLE; - DSIVidCfg.LPLargestPacketSize = 64; - /* Specify for each region of the video frame, if the transmission of command - * in LP mode is allowed in this region */ - /* while streaming is active in video mode */ - DSIVidCfg.LPHorizontalFrontPorchEnable = DSI_LP_HFP_ENABLE; - DSIVidCfg.LPHorizontalBackPorchEnable = DSI_LP_HBP_ENABLE; - DSIVidCfg.LPVerticalActiveEnable = DSI_LP_VACT_ENABLE; - DSIVidCfg.LPVerticalFrontPorchEnable = DSI_LP_VFP_ENABLE; - DSIVidCfg.LPVerticalBackPorchEnable = DSI_LP_VBP_ENABLE; - DSIVidCfg.LPVerticalSyncActiveEnable = DSI_LP_VSYNC_ENABLE; - DSIVidCfg.FrameBTAAcknowledgeEnable = DSI_FBTAA_ENABLE; - DSIVidCfg.LooselyPacked = DSI_LOOSELY_PACKED_DISABLE; - - return HAL_OK; -} - -/** - * @brief MX DSI initialization. - * @param hdsi DSI handle. - * @retval HAL status. - */ -__weak HAL_StatusTypeDef MX_DSI_Init(DSI_HandleTypeDef *hdsi) { - DSI_PLLInitTypeDef PLLInit = {0}; - - /* DSI initialization */ - hdsi->Instance = DSI; - hdsi->Init.AutomaticClockLaneControl = DSI_AUTO_CLK_LANE_CTRL_DISABLE; - /* We have 1 data lane at 500Mbps => lane byte clock at 500/8 = 62,5 MHZ */ - /* We want TX escape clock at around 20MHz and under 20MHz so clock division - * is set to 4 */ - hdsi->Init.TXEscapeCkdiv = 4; - hdsi->Init.NumberOfLanes = DSI_TWO_DATA_LANES; - hdsi->Init.PHYFrequencyRange = DSI_DPHY_FRANGE_450MHZ_510MHZ; - hdsi->Init.PHYLowPowerOffset = 0; - - PLLInit.PLLNDIV = 125; - PLLInit.PLLIDF = 4; - PLLInit.PLLODF = 2; - PLLInit.PLLVCORange = DSI_DPHY_VCO_FRANGE_800MHZ_1GHZ; - PLLInit.PLLChargePump = DSI_PLL_CHARGE_PUMP_2000HZ_4400HZ; - PLLInit.PLLTuning = DSI_PLL_LOOP_FILTER_2000HZ_4400HZ; - - if (HAL_DSI_Init(hdsi, &PLLInit) != HAL_OK) { - return HAL_ERROR; - } - - if (HAL_DSI_SetGenericVCID(&hlcd_dsi, 0) != HAL_OK) { - return HAL_ERROR; - } - - /* Configure the DSI for Video mode */ - DSIVidCfg.VirtualChannelID = 0; - DSIVidCfg.HSPolarity = DSI_HSYNC_ACTIVE_HIGH; - DSIVidCfg.VSPolarity = DSI_VSYNC_ACTIVE_HIGH; - DSIVidCfg.DEPolarity = DSI_DATA_ENABLE_ACTIVE_HIGH; - DSIVidCfg.ColorCoding = DSI_RGB888; - DSIVidCfg.Mode = DSI_VID_MODE_BURST; - DSIVidCfg.PacketSize = LCD_WIDTH; - DSIVidCfg.NullPacketSize = 0xFFFU; - DSIVidCfg.HorizontalSyncActive = HSYNC * 3; - DSIVidCfg.HorizontalBackPorch = HBP * 3; - DSIVidCfg.HorizontalLine = (HACT + HSYNC + HBP + HFP) * 3; - DSIVidCfg.VerticalSyncActive = VSYNC; - DSIVidCfg.VerticalBackPorch = VBP; - DSIVidCfg.VerticalFrontPorch = VFP; - DSIVidCfg.VerticalActive = VACT; - DSIVidCfg.LPCommandEnable = DSI_LP_COMMAND_ENABLE; - DSIVidCfg.LPLargestPacketSize = 64; - /* Specify for each region of the video frame, if the transmission of command - * in LP mode is allowed in this region */ - /* while streaming is active in video mode */ - DSIVidCfg.LPHorizontalFrontPorchEnable = DSI_LP_HFP_ENABLE; - DSIVidCfg.LPHorizontalBackPorchEnable = DSI_LP_HBP_ENABLE; - DSIVidCfg.LPVerticalActiveEnable = DSI_LP_VACT_ENABLE; - DSIVidCfg.LPVerticalFrontPorchEnable = DSI_LP_VFP_ENABLE; - DSIVidCfg.LPVerticalBackPorchEnable = DSI_LP_VBP_ENABLE; - DSIVidCfg.LPVerticalSyncActiveEnable = DSI_LP_VSYNC_ENABLE; - DSIVidCfg.FrameBTAAcknowledgeEnable = DSI_FBTAA_ENABLE; - DSIVidCfg.LooselyPacked = DSI_LOOSELY_PACKED_DISABLE; - - /* Drive the display */ - if (HAL_DSI_ConfigVideoMode(&hlcd_dsi, &DSIVidCfg) != HAL_OK) { - return HAL_ERROR; - } - - return HAL_OK; -} - -/** - * @brief MX DMA2D initialization. - * @param hdma2d DMA2D handle. - * @param Mode DMA2D transfer mode. - * @param OffLine DMA2D output offset. - * @retval HAL status. - */ -__weak HAL_StatusTypeDef MX_DMA2D_Init(DMA2D_HandleTypeDef *hdma2d, - uint32_t Mode, uint32_t OffLine) { - /* Register to memory mode with ARGB8888 as color Mode */ - hdma2d->Instance = DMA2D; - hdma2d->Init.Mode = Mode; - hdma2d->Init.ColorMode = DMA2D_OUTPUT_ARGB8888; - hdma2d->Init.OutputOffset = OffLine; - hdma2d->Init.AlphaInverted = DMA2D_REGULAR_ALPHA; - hdma2d->Init.RedBlueSwap = DMA2D_RB_REGULAR; - hdma2d->Init.BytesSwap = DMA2D_BYTES_REGULAR; - hdma2d->Init.LineOffsetMode = DMA2D_LOM_PIXELS; - - /* DMA2D Initialization */ - return HAL_DMA2D_Init(hdma2d); -} - -#if (USE_HAL_GFXMMU_REGISTER_CALLBACKS == 1) -/** - * @brief Register Default LCD GFXMMU Msp Callbacks - * @retval BSP status - */ -int32_t BSP_LCD_GFXMMU_RegisterDefaultMspCallbacks(uint32_t Instance) { - int32_t status = BSP_ERROR_NONE; - - if (Instance >= LCD_INSTANCES_NBR) { - status = BSP_ERROR_WRONG_PARAM; - } else { - __HAL_GFXMMU_RESET_HANDLE_STATE(&hlcd_gfxmmu); - - /* Register default MspInit/MspDeInit Callback */ - if (HAL_GFXMMU_RegisterCallback(&hlcd_gfxmmu, HAL_GFXMMU_MSPINIT_CB_ID, - GFXMMU_MspInit) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else if (HAL_GFXMMU_RegisterCallback(&hlcd_gfxmmu, - HAL_GFXMMU_MSPDEINIT_CB_ID, - GFXMMU_MspDeInit) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else { - LcdGfxmmu_IsMspCbValid[Instance] = 1U; - } - } - - /* BSP status */ - return status; -} - -/** - * @brief Register LCD GFXMMU Msp Callback - * @param Callbacks pointer to LCD MspInit/MspDeInit callback functions - * @retval BSP status - */ -int32_t BSP_LCD_GFXMMU_RegisterMspCallbacks(uint32_t Instance, - BSP_LCD_GFXMMU_Cb_t *Callback) { - int32_t status = BSP_ERROR_NONE; - - if (Instance >= LCD_INSTANCES_NBR) { - status = BSP_ERROR_WRONG_PARAM; - } else { - __HAL_GFXMMU_RESET_HANDLE_STATE(&hlcd_gfxmmu); - - /* Register MspInit/MspDeInit Callbacks */ - if (HAL_GFXMMU_RegisterCallback(&hlcd_gfxmmu, HAL_GFXMMU_MSPINIT_CB_ID, - Callback->pMspGfxmmuInitCb) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else if (HAL_GFXMMU_RegisterCallback( - &hlcd_gfxmmu, HAL_GFXMMU_MSPDEINIT_CB_ID, - Callback->pMspGfxmmuDeInitCb) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else { - LcdGfxmmu_IsMspCbValid[Instance] = 1U; - } - } - - /* BSP status */ - return status; -} -#endif /* USE_HAL_GFXMMU_REGISTER_CALLBACKS */ - -#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) -/** - * @brief Register Default LCD LTDC Msp Callbacks - * @retval BSP status - */ -int32_t BSP_LCD_LTDC_RegisterDefaultMspCallbacks(uint32_t Instance) { - int32_t status = BSP_ERROR_NONE; - - if (Instance >= LCD_INSTANCES_NBR) { - status = BSP_ERROR_WRONG_PARAM; - } else { - __HAL_LTDC_RESET_HANDLE_STATE(&hlcd_ltdc); - - /* Register default MspInit/MspDeInit Callback */ - if (HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, - LTDC_MspInit) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else if (HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, - LTDC_MspDeInit) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else { - LcdLtdc_IsMspCbValid[Instance] = 1U; - } - } - - /* BSP status */ - return status; -} - -/** - * @brief Register LCD LTDC Msp Callback - * @param Callbacks pointer to LCD MspInit/MspDeInit callback functions - * @retval BSP status - */ -int32_t BSP_LCD_LTDC_RegisterMspCallbacks(uint32_t Instance, - BSP_LCD_LTDC_Cb_t *Callback) { - int32_t status = BSP_ERROR_NONE; - - if (Instance >= LCD_INSTANCES_NBR) { - status = BSP_ERROR_WRONG_PARAM; - } else { - __HAL_LTDC_RESET_HANDLE_STATE(&hlcd_ltdc); - - /* Register MspInit/MspDeInit Callbacks */ - if (HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, - Callback->pMspLtdcInitCb) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else if (HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, - Callback->pMspLtdcDeInitCb) != - HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else { - LcdLtdc_IsMspCbValid[Instance] = 1U; - } - } - - /* BSP status */ - return status; -} -#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */ - -#if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) -/** - * @brief Register Default LCD DSI Msp Callbacks - * @retval BSP status - */ -int32_t BSP_LCD_DSI_RegisterDefaultMspCallbacks(uint32_t Instance) { - int32_t status = BSP_ERROR_NONE; - - if (Instance >= LCD_INSTANCES_NBR) { - status = BSP_ERROR_WRONG_PARAM; - } else { - __HAL_DSI_RESET_HANDLE_STATE(&hlcd_dsi); - - /* Register default MspInit/MspDeInit Callback */ - if (HAL_DSI_RegisterCallback(&hlcd_dsi, HAL_DSI_MSPINIT_CB_ID, - DSI_MspInit) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else if (HAL_DSI_RegisterCallback(&hlcd_dsi, HAL_DSI_MSPDEINIT_CB_ID, - DSI_MspDeInit) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else { - LcdDsi_IsMspCbValid[Instance] = 1U; - } - } - - /* BSP status */ - return status; -} - -/** - * @brief Register LCD DSI Msp Callback - * @param Callbacks pointer to LCD MspInit/MspDeInit callback functions - * @retval BSP status - */ -int32_t BSP_LCD_DSI_RegisterMspCallbacks(uint32_t Instance, - BSP_LCD_DSI_Cb_t *Callback) { - int32_t status = BSP_ERROR_NONE; - - if (Instance >= LCD_INSTANCES_NBR) { - status = BSP_ERROR_WRONG_PARAM; - } else { - __HAL_DSI_RESET_HANDLE_STATE(&hlcd_dsi); - - /* Register MspInit/MspDeInit Callbacks */ - if (HAL_DSI_RegisterCallback(&hlcd_dsi, HAL_DSI_MSPINIT_CB_ID, - Callback->pMspDsiInitCb) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else if (HAL_DSI_RegisterCallback(&hlcd_dsi, HAL_DSI_MSPDEINIT_CB_ID, - Callback->pMspDsiDeInitCb) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else { - LcdDsi_IsMspCbValid[Instance] = 1U; - } - } - - /* BSP status */ - return status; -} -#endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ - -#if (USE_HAL_DMA2D_REGISTER_CALLBACKS == 1) -/** - * @brief Register Default LCD DMA2D Msp Callbacks - * @retval BSP status - */ -int32_t BSP_LCD_DMA2D_RegisterDefaultMspCallbacks(uint32_t Instance) { - int32_t status = BSP_ERROR_NONE; - - if (Instance >= LCD_INSTANCES_NBR) { - status = BSP_ERROR_WRONG_PARAM; - } else { - __HAL_DMA2D_RESET_HANDLE_STATE(&hlcd_dma2d); - - /* Register default MspInit/MspDeInit Callback */ - if (HAL_DMA2D_RegisterCallback(&hlcd_dma2d, HAL_DMA2D_MSPINIT_CB_ID, - DMA2D_MspInit) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else if (HAL_DMA2D_RegisterCallback(&hlcd_dma2d, - HAL_DMA2D_MSPDEINIT_CB_ID, - DMA2D_MspDeInit) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else { - LcdDma2d_IsMspCbValid[Instance] = 1U; - } - } - - /* BSP status */ - return status; -} - -/** - * @brief Register LCD DMA2D Msp Callback - * @param Callbacks pointer to LCD MspInit/MspDeInit callback functions - * @retval BSP status - */ -int32_t BSP_LCD_DMA2D_RegisterMspCallbacks(uint32_t Instance, - BSP_LCD_DMA2D_Cb_t *Callback) { - int32_t status = BSP_ERROR_NONE; - - if (Instance >= LCD_INSTANCES_NBR) { - status = BSP_ERROR_WRONG_PARAM; - } else { - __HAL_DMA2D_RESET_HANDLE_STATE(&hlcd_dma2d); - - /* Register MspInit/MspDeInit Callbacks */ - if (HAL_DMA2D_RegisterCallback(&hlcd_dma2d, HAL_DMA2D_MSPINIT_CB_ID, - Callback->pMspDma2dInitCb) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else if (HAL_DMA2D_RegisterCallback( - &hlcd_dma2d, HAL_DMA2D_MSPDEINIT_CB_ID, - Callback->pMspDma2dDeInitCb) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else { - LcdDma2d_IsMspCbValid[Instance] = 1U; - } - } - - /* BSP status */ - return status; -} -#endif /* USE_HAL_DMA2D_REGISTER_CALLBACKS */ -/** - * @} - */ - -/** @defgroup STM32U5x9J_DISCOVERY_LCD_Private_Functions LCD Private Functions - * @{ - */ - -/** - * @brief Initialize LCD. - * @retval BSP status. - */ -static int32_t LCD_Init(void) { - int32_t status = BSP_ERROR_NONE; - uint32_t ErrorNumber = 0; - DSI_PHY_TimerTypeDef PhyTimers = {0}; - DSI_HOST_TimeoutTypeDef HostTimeouts = {0}; - - /***************/ - /* GFXMMU init */ - /***************/ -#if (USE_HAL_GFXMMU_REGISTER_CALLBACKS == 0) - GFXMMU_MspInit(&hlcd_gfxmmu); -#else - /* Register the GFXMMU MSP Callbacks */ - if (LcdGfxmmu_IsMspCbValid[0] == 0U) { - if (BSP_LCD_GFXMMU_RegisterDefaultMspCallbacks(0) != BSP_ERROR_NONE) { - status = BSP_ERROR_PERIPH_FAILURE; - } - } -#endif /* (USE_HAL_GFXMMU_REGISTER_CALLBACKS == 0) */ - - if (status == BSP_ERROR_NONE) { - /* GFXMMU peripheral initialization */ - if (MX_GFXMMU_Init(&hlcd_gfxmmu) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } - /* Initialize LUT */ - else if (HAL_GFXMMU_ConfigLut(&hlcd_gfxmmu, 0, LCD_WIDTH, - (uint32_t)&gfxmmu_lut) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else { - /* Disable non visible lines : from line 480 to 1023 */ - if (HAL_OK != HAL_GFXMMU_DisableLutLines(&hlcd_gfxmmu, LCD_WIDTH, 544)) { - status = BSP_ERROR_PERIPH_FAILURE; - } - } - } - - /************/ - /* DSI init */ - /************/ - if (status == BSP_ERROR_NONE) { -#if (USE_HAL_DSI_REGISTER_CALLBACKS == 0) - DSI_MspInit(&hlcd_dsi); -#else - /* Register the DSI MSP Callbacks */ - if (LcdDsi_IsMspCbValid[0] == 0U) { - if (BSP_LCD_DSI_RegisterDefaultMspCallbacks(0) != BSP_ERROR_NONE) { - status = BSP_ERROR_PERIPH_FAILURE; - } - } -#endif /* (USE_HAL_DSI_REGISTER_CALLBACKS == 0) */ - - if (status == BSP_ERROR_NONE) { - /* DSI peripheral initialization */ - if (MX_DSI_Init(&hlcd_dsi) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } - } - } - - /*********************/ - /* LCD configuration */ - /*********************/ - if (status == BSP_ERROR_NONE) { - PhyTimers.ClockLaneHS2LPTime = 11; - PhyTimers.ClockLaneLP2HSTime = 40; - PhyTimers.DataLaneHS2LPTime = 12; - PhyTimers.DataLaneLP2HSTime = 23; - PhyTimers.DataLaneMaxReadTime = 0; - PhyTimers.StopWaitTime = 7; - - if (HAL_DSI_ConfigPhyTimer(&hlcd_dsi, &PhyTimers) != HAL_OK) { - return 6; - } - - HostTimeouts.TimeoutCkdiv = 1; - HostTimeouts.HighSpeedTransmissionTimeout = 0; - HostTimeouts.LowPowerReceptionTimeout = 0; - HostTimeouts.HighSpeedReadTimeout = 0; - HostTimeouts.LowPowerReadTimeout = 0; - HostTimeouts.HighSpeedWriteTimeout = 0; - HostTimeouts.HighSpeedWritePrespMode = 0; - HostTimeouts.LowPowerWriteTimeout = 0; - HostTimeouts.BTATimeout = 0; - - if (HAL_DSI_ConfigHostTimeouts(&hlcd_dsi, &HostTimeouts) != HAL_OK) { - return 7; - } - - if (HAL_DSI_ConfigFlowControl(&hlcd_dsi, DSI_FLOW_CONTROL_BTA) != HAL_OK) { - return 7; - } - - /* Enable the DSI host */ - __HAL_DSI_ENABLE(&hlcd_dsi); - - /*************/ - /* LTDC init */ - /*************/ - if (status == BSP_ERROR_NONE) { - if (MX_LTDC_ClockConfig(&hlcd_ltdc) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else { -#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 0) - LTDC_MspInit(&hlcd_ltdc); -#else - /* Register the LTDC MSP Callbacks */ - if (LcdLtdc_IsMspCbValid[0] == 0U) { - if (BSP_LCD_LTDC_RegisterDefaultMspCallbacks(0) != BSP_ERROR_NONE) { - status = BSP_ERROR_PERIPH_FAILURE; - } - } -#endif /* (USE_HAL_GFXMMU_REGISTER_CALLBACKS == 0) */ - - if (status == BSP_ERROR_NONE) { - /* LTDC peripheral initialization */ - if (MX_LTDC_Init(&hlcd_ltdc) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } else { - if (MX_LTDC_ConfigLayer(&hlcd_ltdc, LTDC_LAYER_1, - GFXMMU_VIRTUAL_BUFFER0_BASE_S) != HAL_OK) { - status = BSP_ERROR_PERIPH_FAILURE; - } - } - } - } - } - - /* Start DSI */ - if (HAL_DSI_Start(&(hlcd_dsi)) != HAL_OK) { - return 8; - } - - /* CMD Mode */ - uint8_t InitParam1[3] = {0xFF, 0x83, 0x79}; - if (HAL_DSI_LongWrite(&hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 3, 0xB9, - InitParam1) != HAL_OK) { - ErrorNumber++; - } - - /* SETPOWER */ - uint8_t InitParam2[16] = {0x44, 0x1C, 0x1C, 0x37, 0x57, 0x90, 0xD0, 0xE2, - 0x58, 0x80, 0x38, 0x38, 0xF8, 0x33, 0x34, 0x42}; - if (HAL_DSI_LongWrite(&hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 16, 0xB1, - InitParam2) != HAL_OK) { - ErrorNumber++; - } - - /* SETDISP */ - uint8_t InitParam3[9] = {0x80, 0x14, 0x0C, 0x30, 0x20, - 0x50, 0x11, 0x42, 0x1D}; - if (HAL_DSI_LongWrite(&hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 9, 0xB2, - InitParam3) != HAL_OK) { - ErrorNumber++; - } - - /* Set display cycle timing */ - uint8_t InitParam4[10] = {0x01, 0xAA, 0x01, 0xAF, 0x01, - 0xAF, 0x10, 0xEA, 0x1C, 0xEA}; - if (HAL_DSI_LongWrite(&hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 10, 0xB4, - InitParam4) != HAL_OK) { - ErrorNumber++; - } - - /* SETVCOM */ - uint8_t InitParam5[4] = {00, 00, 00, 0xC0}; - if (HAL_DSI_LongWrite(&hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 4, 0xC7, - InitParam5) != HAL_OK) { - ErrorNumber++; - } - - /* Set Panel Related Registers */ - if (HAL_DSI_ShortWrite(&hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xCC, - 0x02) != HAL_OK) { - ErrorNumber++; - } - - if (HAL_DSI_ShortWrite(&hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xD2, - 0x77) != HAL_OK) { - ErrorNumber++; - } - - uint8_t InitParam6[37] = {0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x08, 0x32, - 0x10, 0x01, 0x00, 0x01, 0x03, 0x72, 0x03, 0x72, - 0x00, 0x08, 0x00, 0x08, 0x33, 0x33, 0x05, 0x05, - 0x37, 0x05, 0x05, 0x37, 0x0A, 0x00, 0x00, 0x00, - 0x0A, 0x00, 0x01, 0x00, 0x0E}; - if (HAL_DSI_LongWrite(&hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 37, 0xD3, - InitParam6) != HAL_OK) { - ErrorNumber++; - } - - uint8_t InitParam7[34] = { - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x18, 0x18, - 0x18, 0x18, 0x19, 0x19, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, - 0x23, 0x22, 0x21, 0x20, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00}; - if (HAL_DSI_LongWrite(&hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 34, 0xD5, - InitParam7) != HAL_OK) { - ErrorNumber++; - } - - uint8_t InitParam8[32] = {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x19, 0x19, 0x18, 0x18, 0x19, 0x19, 0x18, 0x18, - 0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, - 0x20, 0x21, 0x22, 0x23, 0x18, 0x18, 0x18, 0x18}; - if (HAL_DSI_LongWrite(&hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 35, 0xD6, - InitParam8) != HAL_OK) { - ErrorNumber++; - } - - /* SET GAMMA */ - uint8_t InitParam9[42] = { - 0x00, 0x16, 0x1B, 0x30, 0x36, 0x3F, 0x24, 0x40, 0x09, 0x0D, 0x0F, - 0x18, 0x0E, 0x11, 0x12, 0x11, 0x14, 0x07, 0x12, 0x13, 0x18, 0x00, - 0x17, 0x1C, 0x30, 0x36, 0x3F, 0x24, 0x40, 0x09, 0x0C, 0x0F, 0x18, - 0x0E, 0x11, 0x14, 0x11, 0x12, 0x07, 0x12, 0x14, 0x18}; - if (HAL_DSI_LongWrite(&hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 42, 0xE0, - InitParam9) != HAL_OK) { - ErrorNumber++; - } - - uint8_t InitParam10[3] = {0x2C, 0x2C, 00}; - if (HAL_DSI_LongWrite(&hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 3, 0xB6, - InitParam10) != HAL_OK) { - ErrorNumber++; - } - - if (HAL_DSI_ShortWrite(&hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xBD, - 0x00) != HAL_OK) { - ErrorNumber++; - } - - uint8_t InitParam11[] = { - 0x01, 0x00, 0x07, 0x0F, 0x16, 0x1F, 0x27, 0x30, 0x38, 0x40, 0x47, - 0x4E, 0x56, 0x5D, 0x65, 0x6D, 0x74, 0x7D, 0x84, 0x8A, 0x90, 0x99, - 0xA1, 0xA9, 0xB0, 0xB6, 0xBD, 0xC4, 0xCD, 0xD4, 0xDD, 0xE5, 0xEC, - 0xF3, 0x36, 0x07, 0x1C, 0xC0, 0x1B, 0x01, 0xF1, 0x34, 0x00}; - if (HAL_DSI_LongWrite(&hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 42, 0xC1, - InitParam11) != HAL_OK) { - ErrorNumber++; - } - - if (HAL_DSI_ShortWrite(&hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xBD, - 0x01) != HAL_OK) { - ErrorNumber++; - } - - uint8_t InitParam12[] = { - 0x00, 0x08, 0x0F, 0x16, 0x1F, 0x28, 0x31, 0x39, 0x41, 0x48, 0x51, - 0x59, 0x60, 0x68, 0x70, 0x78, 0x7F, 0x87, 0x8D, 0x94, 0x9C, 0xA3, - 0xAB, 0xB3, 0xB9, 0xC1, 0xC8, 0xD0, 0xD8, 0xE0, 0xE8, 0xEE, 0xF5, - 0x3B, 0x1A, 0xB6, 0xA0, 0x07, 0x45, 0xC5, 0x37, 0x00}; - if (HAL_DSI_LongWrite(&hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 42, 0xC1, - InitParam12) != HAL_OK) { - ErrorNumber++; - } - - if (HAL_DSI_ShortWrite(&hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xBD, - 0x02) != HAL_OK) { - ErrorNumber++; - } - - uint8_t InitParam13[42] = { - 0x00, 0x09, 0x0F, 0x18, 0x21, 0x2A, 0x34, 0x3C, 0x45, 0x4C, 0x56, - 0x5E, 0x66, 0x6E, 0x76, 0x7E, 0x87, 0x8E, 0x95, 0x9D, 0xA6, 0xAF, - 0xB7, 0xBD, 0xC5, 0xCE, 0xD5, 0xDF, 0xE7, 0xEE, 0xF4, 0xFA, 0xFF, - 0x0C, 0x31, 0x83, 0x3C, 0x5B, 0x56, 0x1E, 0x5A, 0xFF}; - if (HAL_DSI_LongWrite(&hlcd_dsi, 0, DSI_DCS_LONG_PKT_WRITE, 42, 0xC1, - InitParam13) != HAL_OK) { - ErrorNumber++; - } - - if (HAL_DSI_ShortWrite(&hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, 0xBD, - 0x00) != HAL_OK) { - ErrorNumber++; - } - - /* Exit Sleep Mode*/ - if (HAL_DSI_ShortWrite(&hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P0, 0x11, - 0x00) != HAL_OK) { - ErrorNumber++; - } - - HAL_Delay(120); - - /* Display On */ - if (HAL_DSI_ShortWrite(&hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P0, 0x29, - 0x00) != HAL_OK) { - ErrorNumber++; - } - - HAL_Delay(120); - - if (ErrorNumber != 0U) { - status = BSP_ERROR_PERIPH_FAILURE; - } - } - - return status; -} - -/** - * @brief De-Initialize LCD. - * @retval BSP status. - */ -static int32_t LCD_DeInit(void) { - int32_t status = BSP_ERROR_NONE; - uint32_t ErrorNumber = 0; - - /* Disable DSI wrapper */ - __HAL_DSI_WRAPPER_DISABLE(&hlcd_dsi); - - /* Set display off */ - if (HAL_DSI_ShortWrite(&hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, - DSI_SET_DISPLAY_OFF, 0x00) != HAL_OK) { - ErrorNumber++; - } - - /* Wait before entering in sleep mode */ - HAL_Delay(2000); - - /* Put LCD in sleep mode */ - if (HAL_DSI_ShortWrite(&hlcd_dsi, 0, DSI_DCS_SHORT_PKT_WRITE_P0, - DSI_ENTER_SLEEP_MODE, 0x0) != HAL_OK) { - ErrorNumber++; - } - - HAL_Delay(120); - - /* De-initialize DSI */ - if (HAL_DSI_DeInit(&hlcd_dsi) != HAL_OK) { - ErrorNumber++; - } -#if (USE_HAL_DSI_REGISTER_CALLBACKS == 0) - DSI_MspDeInit(&hlcd_dsi); -#endif /* (USE_HAL_DSI_REGISTER_CALLBACKS == 0) */ - - /* De-initialize LTDC */ - if (HAL_LTDC_DeInit(&hlcd_ltdc) != HAL_OK) { - ErrorNumber++; - } -#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 0) - LTDC_MspDeInit(&hlcd_ltdc); -#endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 0) */ - - /* De-initialize GFXMMU */ - if (HAL_GFXMMU_DeInit(&hlcd_gfxmmu) != HAL_OK) { - ErrorNumber++; - } -#if (USE_HAL_GFXMMU_REGISTER_CALLBACKS == 0) - GFXMMU_MspDeInit(&hlcd_gfxmmu); -#endif /* (USE_HAL_GFXMMU_REGISTER_CALLBACKS == 0) */ - - if (ErrorNumber != 0U) { - status = BSP_ERROR_PERIPH_FAILURE; - } - - return status; -} - -/** - * @brief Initialize GFXMMU MSP. - * @param hgfxmmu GFXMMU handle - * @retval None - */ -static void GFXMMU_MspInit(GFXMMU_HandleTypeDef *hgfxmmu) { - /* Prevent unused argument(s) compilation warning */ - UNUSED(hgfxmmu); - - /* GFXMMU clock enable */ - __HAL_RCC_GFXMMU_CLK_ENABLE(); - - /* Enable GFXMMU interrupt */ - NVIC_SetPriority(GFXMMU_IRQn, IRQ_PRI_NORMAL); - NVIC_EnableIRQ(GFXMMU_IRQn); -} - -/** - * @brief De-Initialize GFXMMU MSP. - * @param hgfxmmu GFXMMU handle - * @retval None - */ -static void GFXMMU_MspDeInit(GFXMMU_HandleTypeDef *hgfxmmu) { - /* Prevent unused argument(s) compilation warning */ - UNUSED(hgfxmmu); - - /* Disable GFXMMU interrupt */ - NVIC_DisableIRQ(GFXMMU_IRQn); - - /* GFXMMU clock disable */ - __HAL_RCC_GFXMMU_CLK_DISABLE(); -} - -/** - * @brief Initialize LTDC MSP. - * @param hltdc LTDC handle - * @retval None - */ -static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc) { - /* Prevent unused argument(s) compilation warning */ - UNUSED(hltdc); - - /* Enable LCD clock */ - __HAL_RCC_LTDC_CLK_ENABLE(); - - /* Enable LTDC interrupt */ - NVIC_SetPriority(LTDC_IRQn, IRQ_PRI_NORMAL); - NVIC_EnableIRQ(LTDC_IRQn); - - NVIC_SetPriority(LTDC_ER_IRQn, IRQ_PRI_NORMAL); - NVIC_EnableIRQ(LTDC_ER_IRQn); -} - -/** - * @brief De-Initialize LTDC MSP. - * @param hltdc LTDC handle - * @retval None - */ -static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc) { - /* Prevent unused argument(s) compilation warning */ - UNUSED(hltdc); - - /* Disable LTDC interrupts */ - NVIC_DisableIRQ(LTDC_ER_IRQn); - NVIC_DisableIRQ(LTDC_IRQn); - - /* LTDC clock disable */ - __HAL_RCC_LTDC_CLK_DISABLE(); -} - -/** - * @brief Initialize DSI MSP. - * @param hdsi DSI handle - * @retval None - */ -static void DSI_MspInit(DSI_HandleTypeDef *hdsi) { - RCC_PeriphCLKInitTypeDef PLL3InitPeriph = {0}; - RCC_PeriphCLKInitTypeDef DSIPHYInitPeriph = {0}; - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - UNUSED(hdsi); - - /* Enable GPIOI & GPIOD clocks */ - __HAL_RCC_GPIOD_CLK_ENABLE(); - __HAL_RCC_GPIOI_CLK_ENABLE(); - - /* Configure DSI Reset pin */ - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_PULLDOWN; - GPIO_InitStruct.Pin = GPIO_PIN_5; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); - - /* Configure LCD Backlight Pin */ - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Pin = GPIO_PIN_6; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); - - /* Enable DSI clock */ - __HAL_RCC_DSI_CLK_ENABLE(); - - /** ################ Set DSI clock to D-PHY source clock ################## - * **/ - - /* Start and configurre PLL3 */ - /* HSE = 16MHZ */ - /* 16/(M=4) = 4MHz input (min) */ - /* 4*(N=125) = 500MHz VCO (almost max) */ - /* 500/(P=8) = 62.5 for DSI ie exactly the lane byte clock*/ - - PLL3InitPeriph.PeriphClockSelection = RCC_PERIPHCLK_DSI; - PLL3InitPeriph.DsiClockSelection = RCC_DSICLKSOURCE_PLL3; - PLL3InitPeriph.PLL3.PLL3M = 4; - PLL3InitPeriph.PLL3.PLL3N = 125; - PLL3InitPeriph.PLL3.PLL3P = 8; - PLL3InitPeriph.PLL3.PLL3Q = 8; - PLL3InitPeriph.PLL3.PLL3R = 24; - PLL3InitPeriph.PLL3.PLL3FRACN = 0; - PLL3InitPeriph.PLL3.PLL3RGE = RCC_PLLVCIRANGE_1; - PLL3InitPeriph.PLL3.PLL3ClockOut = RCC_PLL3_DIVR | RCC_PLL3_DIVP; - PLL3InitPeriph.PLL3.PLL3Source = RCC_PLLSOURCE_HSE; - (void)HAL_RCCEx_PeriphCLKConfig(&PLL3InitPeriph); - - __HAL_RCC_DSI_CLK_ENABLE(); - - /* Switch to D-PHY source clock */ - /* Enable the DSI host */ - hlcd_dsi.Instance = DSI; - - __HAL_DSI_ENABLE(&hlcd_dsi); - - /* Enable the DSI PLL */ - __HAL_DSI_PLL_ENABLE(&hlcd_dsi); - - HAL_Delay(1); - - /* Enable the clock lane and the digital section of the D-PHY */ - hlcd_dsi.Instance->PCTLR |= (DSI_PCTLR_CKE | DSI_PCTLR_DEN); - - /* Set the TX escape clock division factor */ - hlcd_dsi.Instance->CCR = 4; - - HAL_Delay(1); - - /* Config DSI Clock to DSI PHY */ - DSIPHYInitPeriph.PeriphClockSelection = RCC_PERIPHCLK_DSI; - DSIPHYInitPeriph.DsiClockSelection = RCC_DSICLKSOURCE_DSIPHY; - - (void)HAL_RCCEx_PeriphCLKConfig(&DSIPHYInitPeriph); - - /* Reset */ - HAL_Delay(11); - HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5, GPIO_PIN_SET); - HAL_Delay(150); - - /* Reset the TX escape clock division factor */ - hlcd_dsi.Instance->CCR &= ~DSI_CCR_TXECKDIV; - - /* Disable the DSI PLL */ - __HAL_DSI_PLL_DISABLE(&hlcd_dsi); - - /* Disable the DSI host */ - __HAL_DSI_DISABLE(&hlcd_dsi); - - /** ######################################################################### - * **/ - - /* Enable DSI NVIC interrupt */ - /* Default is lowest priority level */ - NVIC_SetPriority(DSI_IRQn, IRQ_PRI_NORMAL); - NVIC_EnableIRQ(DSI_IRQn); -} - -/** - * @brief De-Initialize DSI MSP. - * @param hdsi DSI handle - * @retval None - */ -static void DSI_MspDeInit(DSI_HandleTypeDef *hdsi) { - RCC_PeriphCLKInitTypeDef PLL3InitPeriph = {0}; - - UNUSED(hdsi); - - /* Switch to PLL3 before Disable */ - PLL3InitPeriph.PeriphClockSelection = RCC_PERIPHCLK_DSI; - PLL3InitPeriph.DsiClockSelection = RCC_DSICLKSOURCE_PLL3; - PLL3InitPeriph.PLL3.PLL3M = 4; - PLL3InitPeriph.PLL3.PLL3N = 125; - PLL3InitPeriph.PLL3.PLL3P = 8; - PLL3InitPeriph.PLL3.PLL3Q = 8; - PLL3InitPeriph.PLL3.PLL3R = 24; - PLL3InitPeriph.PLL3.PLL3FRACN = 0; - PLL3InitPeriph.PLL3.PLL3RGE = RCC_PLLVCIRANGE_1; - PLL3InitPeriph.PLL3.PLL3ClockOut = RCC_PLL3_DIVR | RCC_PLL3_DIVP; - PLL3InitPeriph.PLL3.PLL3Source = RCC_PLLSOURCE_HSE; - (void)HAL_RCCEx_PeriphCLKConfig(&PLL3InitPeriph); - - /* DSI clock disable */ - __HAL_RCC_DSI_CLK_DISABLE(); - - /** @brief Toggle Sw reset of DSI IP */ - __HAL_RCC_DSI_FORCE_RESET(); - __HAL_RCC_DSI_RELEASE_RESET(); - - /* Disable DSI interrupts */ - NVIC_DisableIRQ(DSI_IRQn); -} - -void display_pixeldata(uint16_t c) { - uint32_t address = 0; - - if (act_frame_buffer == 0) { - address = GFXMMU_VIRTUAL_BUFFER1_BASE_S; - } else { - address = GFXMMU_VIRTUAL_BUFFER0_BASE_S; - } - - /* Get the rectangle start address */ - address = - (address + (4 * ((cursor_y + 120) * PIXEL_PER_LINE + (cursor_x + 120)))); - - *(__IO uint32_t *)(address) = rgb565_to_rgb888(c) | 0xFF000000; - - cursor_x++; - if (cursor_x > window_x1) { - cursor_x = window_x0; - cursor_y++; - } - if (cursor_y > window_y1) { - cursor_y = window_y0; - } -} - -// this is just for compatibility with DMA2D using algorithms -uint8_t *const DISPLAY_DATA_ADDRESS = 0; - -void display_reset_state() {} - -void display_set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { - window_x0 = x0; - window_y0 = y0; - window_x1 = x1; - window_y1 = y1; - cursor_x = x0; - cursor_y = y0; -} - -uint8_t *display_get_wr_addr(void) { - uint32_t address = 0; - - if (act_frame_buffer == 0) { - address = GFXMMU_VIRTUAL_BUFFER1_BASE_S; - } else { - address = GFXMMU_VIRTUAL_BUFFER0_BASE_S; - } - - /* Get the rectangle start address */ - address = - (address + (4 * ((cursor_y + 120) * PIXEL_PER_LINE + (cursor_x + 120)))); - - return (uint8_t *)address; -} - -uint32_t *display_get_fb_addr(void) { - uint32_t address = 0; - - if (act_frame_buffer == 0) { - address = GFXMMU_VIRTUAL_BUFFER1_BASE_S; - } else { - address = GFXMMU_VIRTUAL_BUFFER0_BASE_S; - } - - return (uint32_t *)address; -} - -void display_efficient_clear(void) { - if (act_frame_buffer == 0) { - memset(PhysFrameBuffer1, 0x00, sizeof(PhysFrameBuffer1)); - } else { - memset(PhysFrameBuffer0, 0x00, sizeof(PhysFrameBuffer0)); - } -} - -uint16_t display_get_window_width(void) { return window_x1 - window_x0 + 1; } - -uint16_t display_get_window_height(void) { return window_y1 - window_y0 + 1; } - -void display_shift_window(uint16_t pixels) { - uint16_t w = display_get_window_width(); - uint16_t h = display_get_window_height(); - - uint16_t line_rem = w - (cursor_x - window_x0); - - if (pixels < line_rem) { - cursor_x += pixels; - return; - } - - // start of next line - pixels = pixels - line_rem; - cursor_x = window_x0; - cursor_y++; - - // add the rest of pixels - cursor_y = window_y0 + (((cursor_y - window_y0) + (pixels / w)) % h); - cursor_x += pixels % w; -} - -uint16_t display_get_window_offset(void) { - return PIXEL_PER_LINE - display_get_window_width(); -} - -int display_orientation(int degrees) { return degrees; } - -int display_get_orientation(void) { return 0; } -int display_backlight(int val) { return val; } - -void display_init_all(void) { - RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; - - /** Initializes the common periph clock - */ - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LTDC | RCC_PERIPHCLK_DSI; - PeriphClkInit.DsiClockSelection = RCC_DSICLKSOURCE_PLL3; - PeriphClkInit.LtdcClockSelection = RCC_LTDCCLKSOURCE_PLL3; - PeriphClkInit.PLL3.PLL3Source = RCC_PLLSOURCE_HSE; - PeriphClkInit.PLL3.PLL3M = 4; - PeriphClkInit.PLL3.PLL3N = 125; - PeriphClkInit.PLL3.PLL3P = 8; - PeriphClkInit.PLL3.PLL3Q = 2; - PeriphClkInit.PLL3.PLL3R = 24; - PeriphClkInit.PLL3.PLL3RGE = RCC_PLLVCIRANGE_0; - PeriphClkInit.PLL3.PLL3FRACN = 0; - PeriphClkInit.PLL3.PLL3ClockOut = RCC_PLL3_DIVP | RCC_PLL3_DIVR; - HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); - - memset(PhysFrameBuffer0, 0x00, sizeof(PhysFrameBuffer0)); - memset(PhysFrameBuffer1, 0x00, sizeof(PhysFrameBuffer1)); - memcpy(gfxmmu_lut, gfxmmu_lut_config_argb8888, - sizeof(gfxmmu_lut_config_argb8888)); - - BSP_LCD_Init(0, LCD_ORIENTATION_PORTRAIT); - - BSP_LCD_SetBrightness(0, 100); - BSP_LCD_SetActiveLayer(0, 0); - BSP_LCD_DisplayOn(0); -} -void display_reinit(void) { - memcpy(gfxmmu_lut, gfxmmu_lut_config_argb8888, - sizeof(gfxmmu_lut_config_argb8888)); - - /* Switch to D-PHY source clock */ - /* Enable the DSI host */ - hlcd_dsi.Instance = DSI; - MX_GFXMMU_Reinit(&hlcd_gfxmmu); - MX_DSI_Reinit(&hlcd_dsi); - MX_LTDC_Reinit(&hlcd_ltdc); - - if (act_frame_buffer == 0) { - MX_LTDC_ConfigLayer(&hlcd_ltdc, 0, GFXMMU_VIRTUAL_BUFFER0_BASE_S); - } else { - MX_LTDC_ConfigLayer(&hlcd_ltdc, 0, GFXMMU_VIRTUAL_BUFFER1_BASE_S); - } -} -void display_sync(void) {} - -void display_refresh(void) { - if (act_frame_buffer == 0) { - act_frame_buffer = 1; - MX_LTDC_ConfigLayer(&hlcd_ltdc, 0, GFXMMU_VIRTUAL_BUFFER1_BASE_S); - memcpy(PhysFrameBuffer0, PhysFrameBuffer1, sizeof(PhysFrameBuffer1)); - } else { - act_frame_buffer = 0; - MX_LTDC_ConfigLayer(&hlcd_ltdc, 0, GFXMMU_VIRTUAL_BUFFER0_BASE_S); - memcpy(PhysFrameBuffer1, PhysFrameBuffer0, sizeof(PhysFrameBuffer1)); - } -} - -const char *display_save(const char *prefix) { return NULL; } - -void display_clear_save(void) {} - -void display_pixeldata_dirty(void) {} - -void display_finish_actions(void) {} diff --git a/core/embed/trezorhal/stm32u5/displays/dsi.h b/core/embed/trezorhal/stm32u5/displays/dsi.h deleted file mode 100644 index c23daf557d..0000000000 --- a/core/embed/trezorhal/stm32u5/displays/dsi.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef DSI_H_ -#define DSI_H_ - -#include -#include - -#define DISPLAY_COLOR_MODE DMA2D_OUTPUT_ARGB8888 -#define DISPLAY_FRAMEBUFFER_WIDTH 768 -#define DISPLAY_FRAMEBUFFER_HEIGHT 480 -#define DISPLAY_FRAMEBUFFER_OFFSET_X 120 -#define DISPLAY_FRAMEBUFFER_OFFSET_Y 120 - -#define DISPLAY_EFFICIENT_CLEAR 1 - -extern uint8_t* const DISPLAY_DATA_ADDRESS; - -uint32_t rgb565_to_rgb888(uint16_t color); - -static inline void display_pixel(uint8_t* fb, int16_t x, int16_t y, - uint16_t color) { - uint32_t p = 4 * ((y + 120) * DISPLAY_FRAMEBUFFER_WIDTH + (x + 120)); - uint32_t c = rgb565_to_rgb888(color); - *((uint32_t*)(fb + p)) = c; -} - -#endif diff --git a/core/embed/trezorhal/stm32u5/displays/gfxmmu_lut.h b/core/embed/trezorhal/stm32u5/displays/gfxmmu_lut.h deleted file mode 100644 index 7360378e8c..0000000000 --- a/core/embed/trezorhal/stm32u5/displays/gfxmmu_lut.h +++ /dev/null @@ -1,1006 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * File Name : gfxmmu_lut.h - * Description : header file for GFX MMU Configuration Table - ****************************************************************************** - * @attention - * - * Copyright (c) 2022 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __gfxmmu_lut_H -#define __gfxmmu_lut_H -#ifdef __cplusplus -extern "C" { -#endif -// GFX MMU Configuration Table - -#define GFXMMU_FB_SIZE 733936 -#define GFXMMU_LUT_FIRST 0 -#define GFXMMU_LUT_LAST 479 -#define GFXMMU_LUT_SIZE 480 - -uint32_t gfxmmu_lut_config_argb8888[2 * GFXMMU_LUT_SIZE] = { - 0x00413601, // GFXMMU_LUT0L - 0x003FFCA0, // GFXMMU_LUT0H - 0x00433401, // GFXMMU_LUT1L - 0x003FFD80, // GFXMMU_LUT1H - 0x00453201, // GFXMMU_LUT2L - 0x003FFEA0, // GFXMMU_LUT2H - 0x00463101, // GFXMMU_LUT3L - 0x003FFFF0, // GFXMMU_LUT3H - 0x00482F01, // GFXMMU_LUT4L - 0x00000170, // GFXMMU_LUT4H - 0x00492E01, // GFXMMU_LUT5L - 0x00000320, // GFXMMU_LUT5H - 0x004A2D01, // GFXMMU_LUT6L - 0x000004F0, // GFXMMU_LUT6H - 0x004B2C01, // GFXMMU_LUT7L - 0x000006E0, // GFXMMU_LUT7H - 0x004C2B01, // GFXMMU_LUT8L - 0x000008F0, // GFXMMU_LUT8H - 0x004D2A01, // GFXMMU_LUT9L - 0x00000B20, // GFXMMU_LUT9H - 0x004D2A01, // GFXMMU_LUT10L - 0x00000D60, // GFXMMU_LUT10H - 0x004E2901, // GFXMMU_LUT11L - 0x00000FB0, // GFXMMU_LUT11H - 0x004F2801, // GFXMMU_LUT12L - 0x00001220, // GFXMMU_LUT12H - 0x00502701, // GFXMMU_LUT13L - 0x000014B0, // GFXMMU_LUT13H - 0x00502701, // GFXMMU_LUT14L - 0x00001750, // GFXMMU_LUT14H - 0x00512601, // GFXMMU_LUT15L - 0x00001A00, // GFXMMU_LUT15H - 0x00522501, // GFXMMU_LUT16L - 0x00001CD0, // GFXMMU_LUT16H - 0x00522501, // GFXMMU_LUT17L - 0x00001FB0, // GFXMMU_LUT17H - 0x00532401, // GFXMMU_LUT18L - 0x000022A0, // GFXMMU_LUT18H - 0x00532401, // GFXMMU_LUT19L - 0x000025A0, // GFXMMU_LUT19H - 0x00542301, // GFXMMU_LUT20L - 0x000028B0, // GFXMMU_LUT20H - 0x00552201, // GFXMMU_LUT21L - 0x00002BE0, // GFXMMU_LUT21H - 0x00552201, // GFXMMU_LUT22L - 0x00002F20, // GFXMMU_LUT22H - 0x00562101, // GFXMMU_LUT23L - 0x00003270, // GFXMMU_LUT23H - 0x00562101, // GFXMMU_LUT24L - 0x000035D0, // GFXMMU_LUT24H - 0x00572001, // GFXMMU_LUT25L - 0x00003940, // GFXMMU_LUT25H - 0x00572001, // GFXMMU_LUT26L - 0x00003CC0, // GFXMMU_LUT26H - 0x00581F01, // GFXMMU_LUT27L - 0x00004050, // GFXMMU_LUT27H - 0x00581F01, // GFXMMU_LUT28L - 0x000043F0, // GFXMMU_LUT28H - 0x00591E01, // GFXMMU_LUT29L - 0x000047A0, // GFXMMU_LUT29H - 0x00591E01, // GFXMMU_LUT30L - 0x00004B60, // GFXMMU_LUT30H - 0x00591E01, // GFXMMU_LUT31L - 0x00004F20, // GFXMMU_LUT31H - 0x005A1D01, // GFXMMU_LUT32L - 0x000052F0, // GFXMMU_LUT32H - 0x005A1D01, // GFXMMU_LUT33L - 0x000056D0, // GFXMMU_LUT33H - 0x005B1C01, // GFXMMU_LUT34L - 0x00005AC0, // GFXMMU_LUT34H - 0x005B1C01, // GFXMMU_LUT35L - 0x00005EC0, // GFXMMU_LUT35H - 0x005C1B01, // GFXMMU_LUT36L - 0x000062D0, // GFXMMU_LUT36H - 0x005C1B01, // GFXMMU_LUT37L - 0x000066F0, // GFXMMU_LUT37H - 0x005C1B01, // GFXMMU_LUT38L - 0x00006B10, // GFXMMU_LUT38H - 0x005D1A01, // GFXMMU_LUT39L - 0x00006F40, // GFXMMU_LUT39H - 0x005D1A01, // GFXMMU_LUT40L - 0x00007380, // GFXMMU_LUT40H - 0x005D1A01, // GFXMMU_LUT41L - 0x000077C0, // GFXMMU_LUT41H - 0x005E1901, // GFXMMU_LUT42L - 0x00007C10, // GFXMMU_LUT42H - 0x005E1901, // GFXMMU_LUT43L - 0x00008070, // GFXMMU_LUT43H - 0x005E1901, // GFXMMU_LUT44L - 0x000084D0, // GFXMMU_LUT44H - 0x005F1801, // GFXMMU_LUT45L - 0x00008940, // GFXMMU_LUT45H - 0x005F1801, // GFXMMU_LUT46L - 0x00008DC0, // GFXMMU_LUT46H - 0x00601801, // GFXMMU_LUT47L - 0x00009240, // GFXMMU_LUT47H - 0x00601701, // GFXMMU_LUT48L - 0x000096E0, // GFXMMU_LUT48H - 0x00601701, // GFXMMU_LUT49L - 0x00009B80, // GFXMMU_LUT49H - 0x00601701, // GFXMMU_LUT50L - 0x0000A020, // GFXMMU_LUT50H - 0x00611601, // GFXMMU_LUT51L - 0x0000A4D0, // GFXMMU_LUT51H - 0x00611601, // GFXMMU_LUT52L - 0x0000A990, // GFXMMU_LUT52H - 0x00611601, // GFXMMU_LUT53L - 0x0000AE50, // GFXMMU_LUT53H - 0x00621501, // GFXMMU_LUT54L - 0x0000B320, // GFXMMU_LUT54H - 0x00621501, // GFXMMU_LUT55L - 0x0000B800, // GFXMMU_LUT55H - 0x00621501, // GFXMMU_LUT56L - 0x0000BCE0, // GFXMMU_LUT56H - 0x00631401, // GFXMMU_LUT57L - 0x0000C1D0, // GFXMMU_LUT57H - 0x00631401, // GFXMMU_LUT58L - 0x0000C6D0, // GFXMMU_LUT58H - 0x00631401, // GFXMMU_LUT59L - 0x0000CBD0, // GFXMMU_LUT59H - 0x00631401, // GFXMMU_LUT60L - 0x0000D0D0, // GFXMMU_LUT60H - 0x00641301, // GFXMMU_LUT61L - 0x0000D5E0, // GFXMMU_LUT61H - 0x00641301, // GFXMMU_LUT62L - 0x0000DB00, // GFXMMU_LUT62H - 0x00641301, // GFXMMU_LUT63L - 0x0000E020, // GFXMMU_LUT63H - 0x00651201, // GFXMMU_LUT64L - 0x0000E550, // GFXMMU_LUT64H - 0x00651201, // GFXMMU_LUT65L - 0x0000EA90, // GFXMMU_LUT65H - 0x00651201, // GFXMMU_LUT66L - 0x0000EFD0, // GFXMMU_LUT66H - 0x00651201, // GFXMMU_LUT67L - 0x0000F510, // GFXMMU_LUT67H - 0x00661101, // GFXMMU_LUT68L - 0x0000FA60, // GFXMMU_LUT68H - 0x00661101, // GFXMMU_LUT69L - 0x0000FFC0, // GFXMMU_LUT69H - 0x00661101, // GFXMMU_LUT70L - 0x00010520, // GFXMMU_LUT70H - 0x00661101, // GFXMMU_LUT71L - 0x00010A80, // GFXMMU_LUT71H - 0x00671001, // GFXMMU_LUT72L - 0x00010FF0, // GFXMMU_LUT72H - 0x00671001, // GFXMMU_LUT73L - 0x00011570, // GFXMMU_LUT73H - 0x00671001, // GFXMMU_LUT74L - 0x00011AF0, // GFXMMU_LUT74H - 0x00671001, // GFXMMU_LUT75L - 0x00012070, // GFXMMU_LUT75H - 0x00680F01, // GFXMMU_LUT76L - 0x00012600, // GFXMMU_LUT76H - 0x00680F01, // GFXMMU_LUT77L - 0x00012BA0, // GFXMMU_LUT77H - 0x00680F01, // GFXMMU_LUT78L - 0x00013140, // GFXMMU_LUT78H - 0x00680F01, // GFXMMU_LUT79L - 0x000136E0, // GFXMMU_LUT79H - 0x00680F01, // GFXMMU_LUT80L - 0x00013C80, // GFXMMU_LUT80H - 0x00690E01, // GFXMMU_LUT81L - 0x00014230, // GFXMMU_LUT81H - 0x00690E01, // GFXMMU_LUT82L - 0x000147F0, // GFXMMU_LUT82H - 0x00690E01, // GFXMMU_LUT83L - 0x00014DB0, // GFXMMU_LUT83H - 0x00690E01, // GFXMMU_LUT84L - 0x00015370, // GFXMMU_LUT84H - 0x006A0D01, // GFXMMU_LUT85L - 0x00015940, // GFXMMU_LUT85H - 0x006A0D01, // GFXMMU_LUT86L - 0x00015F20, // GFXMMU_LUT86H - 0x006A0D01, // GFXMMU_LUT87L - 0x00016500, // GFXMMU_LUT87H - 0x006A0D01, // GFXMMU_LUT88L - 0x00016AE0, // GFXMMU_LUT88H - 0x006A0D01, // GFXMMU_LUT89L - 0x000170C0, // GFXMMU_LUT89H - 0x006B0C01, // GFXMMU_LUT90L - 0x000176B0, // GFXMMU_LUT90H - 0x006B0C01, // GFXMMU_LUT91L - 0x00017CB0, // GFXMMU_LUT91H - 0x006B0C01, // GFXMMU_LUT92L - 0x000182B0, // GFXMMU_LUT92H - 0x006B0C01, // GFXMMU_LUT93L - 0x000188B0, // GFXMMU_LUT93H - 0x006B0C01, // GFXMMU_LUT94L - 0x00018EB0, // GFXMMU_LUT94H - 0x006C0C01, // GFXMMU_LUT95L - 0x000194B0, // GFXMMU_LUT95H - 0x006C0B01, // GFXMMU_LUT96L - 0x00019AD0, // GFXMMU_LUT96H - 0x006C0B01, // GFXMMU_LUT97L - 0x0001A0F0, // GFXMMU_LUT97H - 0x006C0B01, // GFXMMU_LUT98L - 0x0001A710, // GFXMMU_LUT98H - 0x006C0B01, // GFXMMU_LUT99L - 0x0001AD30, // GFXMMU_LUT99H - 0x006C0B01, // GFXMMU_LUT100L - 0x0001B350, // GFXMMU_LUT100H - 0x006D0A01, // GFXMMU_LUT101L - 0x0001B980, // GFXMMU_LUT101H - 0x006D0A01, // GFXMMU_LUT102L - 0x0001BFC0, // GFXMMU_LUT102H - 0x006D0A01, // GFXMMU_LUT103L - 0x0001C600, // GFXMMU_LUT103H - 0x006D0A01, // GFXMMU_LUT104L - 0x0001CC40, // GFXMMU_LUT104H - 0x006D0A01, // GFXMMU_LUT105L - 0x0001D280, // GFXMMU_LUT105H - 0x006D0A01, // GFXMMU_LUT106L - 0x0001D8C0, // GFXMMU_LUT106H - 0x006E0901, // GFXMMU_LUT107L - 0x0001DF10, // GFXMMU_LUT107H - 0x006E0901, // GFXMMU_LUT108L - 0x0001E570, // GFXMMU_LUT108H - 0x006E0901, // GFXMMU_LUT109L - 0x0001EBD0, // GFXMMU_LUT109H - 0x006E0901, // GFXMMU_LUT110L - 0x0001F230, // GFXMMU_LUT110H - 0x006E0901, // GFXMMU_LUT111L - 0x0001F890, // GFXMMU_LUT111H - 0x006E0901, // GFXMMU_LUT112L - 0x0001FEF0, // GFXMMU_LUT112H - 0x006F0801, // GFXMMU_LUT113L - 0x00020560, // GFXMMU_LUT113H - 0x006F0801, // GFXMMU_LUT114L - 0x00020BE0, // GFXMMU_LUT114H - 0x006F0801, // GFXMMU_LUT115L - 0x00021260, // GFXMMU_LUT115H - 0x006F0801, // GFXMMU_LUT116L - 0x000218E0, // GFXMMU_LUT116H - 0x006F0801, // GFXMMU_LUT117L - 0x00021F60, // GFXMMU_LUT117H - 0x006F0801, // GFXMMU_LUT118L - 0x000225E0, // GFXMMU_LUT118H - 0x006F0801, // GFXMMU_LUT119L - 0x00022C60, // GFXMMU_LUT119H - 0x00700701, // GFXMMU_LUT120L - 0x000232F0, // GFXMMU_LUT120H - 0x00700701, // GFXMMU_LUT121L - 0x00023990, // GFXMMU_LUT121H - 0x00700701, // GFXMMU_LUT122L - 0x00024030, // GFXMMU_LUT122H - 0x00700701, // GFXMMU_LUT123L - 0x000246D0, // GFXMMU_LUT123H - 0x00700701, // GFXMMU_LUT124L - 0x00024D70, // GFXMMU_LUT124H - 0x00700701, // GFXMMU_LUT125L - 0x00025410, // GFXMMU_LUT125H - 0x00700701, // GFXMMU_LUT126L - 0x00025AB0, // GFXMMU_LUT126H - 0x00710601, // GFXMMU_LUT127L - 0x00026160, // GFXMMU_LUT127H - 0x00710601, // GFXMMU_LUT128L - 0x00026820, // GFXMMU_LUT128H - 0x00710601, // GFXMMU_LUT129L - 0x00026EE0, // GFXMMU_LUT129H - 0x00710601, // GFXMMU_LUT130L - 0x000275A0, // GFXMMU_LUT130H - 0x00710601, // GFXMMU_LUT131L - 0x00027C60, // GFXMMU_LUT131H - 0x00710601, // GFXMMU_LUT132L - 0x00028320, // GFXMMU_LUT132H - 0x00710601, // GFXMMU_LUT133L - 0x000289E0, // GFXMMU_LUT133H - 0x00710601, // GFXMMU_LUT134L - 0x000290A0, // GFXMMU_LUT134H - 0x00720501, // GFXMMU_LUT135L - 0x00029770, // GFXMMU_LUT135H - 0x00720501, // GFXMMU_LUT136L - 0x00029E50, // GFXMMU_LUT136H - 0x00720501, // GFXMMU_LUT137L - 0x0002A530, // GFXMMU_LUT137H - 0x00720501, // GFXMMU_LUT138L - 0x0002AC10, // GFXMMU_LUT138H - 0x00720501, // GFXMMU_LUT139L - 0x0002B2F0, // GFXMMU_LUT139H - 0x00720501, // GFXMMU_LUT140L - 0x0002B9D0, // GFXMMU_LUT140H - 0x00720501, // GFXMMU_LUT141L - 0x0002C0B0, // GFXMMU_LUT141H - 0x00720501, // GFXMMU_LUT142L - 0x0002C790, // GFXMMU_LUT142H - 0x00720501, // GFXMMU_LUT143L - 0x0002CE70, // GFXMMU_LUT143H - 0x00730401, // GFXMMU_LUT144L - 0x0002D560, // GFXMMU_LUT144H - 0x00730401, // GFXMMU_LUT145L - 0x0002DC60, // GFXMMU_LUT145H - 0x00730401, // GFXMMU_LUT146L - 0x0002E360, // GFXMMU_LUT146H - 0x00730401, // GFXMMU_LUT147L - 0x0002EA60, // GFXMMU_LUT147H - 0x00730401, // GFXMMU_LUT148L - 0x0002F160, // GFXMMU_LUT148H - 0x00730401, // GFXMMU_LUT149L - 0x0002F860, // GFXMMU_LUT149H - 0x00730401, // GFXMMU_LUT150L - 0x0002FF60, // GFXMMU_LUT150H - 0x00730401, // GFXMMU_LUT151L - 0x00030660, // GFXMMU_LUT151H - 0x00730401, // GFXMMU_LUT152L - 0x00030D60, // GFXMMU_LUT152H - 0x00740301, // GFXMMU_LUT153L - 0x00031470, // GFXMMU_LUT153H - 0x00740301, // GFXMMU_LUT154L - 0x00031B90, // GFXMMU_LUT154H - 0x00740301, // GFXMMU_LUT155L - 0x000322B0, // GFXMMU_LUT155H - 0x00740301, // GFXMMU_LUT156L - 0x000329D0, // GFXMMU_LUT156H - 0x00740301, // GFXMMU_LUT157L - 0x000330F0, // GFXMMU_LUT157H - 0x00740301, // GFXMMU_LUT158L - 0x00033810, // GFXMMU_LUT158H - 0x00740301, // GFXMMU_LUT159L - 0x00033F30, // GFXMMU_LUT159H - 0x00740301, // GFXMMU_LUT160L - 0x00034650, // GFXMMU_LUT160H - 0x00740301, // GFXMMU_LUT161L - 0x00034D70, // GFXMMU_LUT161H - 0x00740301, // GFXMMU_LUT162L - 0x00035490, // GFXMMU_LUT162H - 0x00740301, // GFXMMU_LUT163L - 0x00035BB0, // GFXMMU_LUT163H - 0x00740301, // GFXMMU_LUT164L - 0x000362D0, // GFXMMU_LUT164H - 0x00750201, // GFXMMU_LUT165L - 0x00036A00, // GFXMMU_LUT165H - 0x00750201, // GFXMMU_LUT166L - 0x00037140, // GFXMMU_LUT166H - 0x00750201, // GFXMMU_LUT167L - 0x00037880, // GFXMMU_LUT167H - 0x00750201, // GFXMMU_LUT168L - 0x00037FC0, // GFXMMU_LUT168H - 0x00750201, // GFXMMU_LUT169L - 0x00038700, // GFXMMU_LUT169H - 0x00750201, // GFXMMU_LUT170L - 0x00038E40, // GFXMMU_LUT170H - 0x00750201, // GFXMMU_LUT171L - 0x00039580, // GFXMMU_LUT171H - 0x00750201, // GFXMMU_LUT172L - 0x00039CC0, // GFXMMU_LUT172H - 0x00750201, // GFXMMU_LUT173L - 0x0003A400, // GFXMMU_LUT173H - 0x00750201, // GFXMMU_LUT174L - 0x0003AB40, // GFXMMU_LUT174H - 0x00750201, // GFXMMU_LUT175L - 0x0003B280, // GFXMMU_LUT175H - 0x00750201, // GFXMMU_LUT176L - 0x0003B9C0, // GFXMMU_LUT176H - 0x00750201, // GFXMMU_LUT177L - 0x0003C100, // GFXMMU_LUT177H - 0x00760101, // GFXMMU_LUT178L - 0x0003C850, // GFXMMU_LUT178H - 0x00760101, // GFXMMU_LUT179L - 0x0003CFB0, // GFXMMU_LUT179H - 0x00760101, // GFXMMU_LUT180L - 0x0003D710, // GFXMMU_LUT180H - 0x00760101, // GFXMMU_LUT181L - 0x0003DE70, // GFXMMU_LUT181H - 0x00760101, // GFXMMU_LUT182L - 0x0003E5D0, // GFXMMU_LUT182H - 0x00760101, // GFXMMU_LUT183L - 0x0003ED30, // GFXMMU_LUT183H - 0x00760101, // GFXMMU_LUT184L - 0x0003F490, // GFXMMU_LUT184H - 0x00760101, // GFXMMU_LUT185L - 0x0003FBF0, // GFXMMU_LUT185H - 0x00760101, // GFXMMU_LUT186L - 0x00040350, // GFXMMU_LUT186H - 0x00760101, // GFXMMU_LUT187L - 0x00040AB0, // GFXMMU_LUT187H - 0x00760101, // GFXMMU_LUT188L - 0x00041210, // GFXMMU_LUT188H - 0x00760101, // GFXMMU_LUT189L - 0x00041970, // GFXMMU_LUT189H - 0x00760101, // GFXMMU_LUT190L - 0x000420D0, // GFXMMU_LUT190H - 0x00760101, // GFXMMU_LUT191L - 0x00042830, // GFXMMU_LUT191H - 0x00760101, // GFXMMU_LUT192L - 0x00042F90, // GFXMMU_LUT192H - 0x00760101, // GFXMMU_LUT193L - 0x000436F0, // GFXMMU_LUT193H - 0x00760101, // GFXMMU_LUT194L - 0x00043E50, // GFXMMU_LUT194H - 0x00760101, // GFXMMU_LUT195L - 0x000445B0, // GFXMMU_LUT195H - 0x00770001, // GFXMMU_LUT196L - 0x00044D20, // GFXMMU_LUT196H - 0x00770001, // GFXMMU_LUT197L - 0x000454A0, // GFXMMU_LUT197H - 0x00770001, // GFXMMU_LUT198L - 0x00045C20, // GFXMMU_LUT198H - 0x00770001, // GFXMMU_LUT199L - 0x000463A0, // GFXMMU_LUT199H - 0x00770001, // GFXMMU_LUT200L - 0x00046B20, // GFXMMU_LUT200H - 0x00770001, // GFXMMU_LUT201L - 0x000472A0, // GFXMMU_LUT201H - 0x00770001, // GFXMMU_LUT202L - 0x00047A20, // GFXMMU_LUT202H - 0x00770001, // GFXMMU_LUT203L - 0x000481A0, // GFXMMU_LUT203H - 0x00770001, // GFXMMU_LUT204L - 0x00048920, // GFXMMU_LUT204H - 0x00770001, // GFXMMU_LUT205L - 0x000490A0, // GFXMMU_LUT205H - 0x00770001, // GFXMMU_LUT206L - 0x00049820, // GFXMMU_LUT206H - 0x00770001, // GFXMMU_LUT207L - 0x00049FA0, // GFXMMU_LUT207H - 0x00770001, // GFXMMU_LUT208L - 0x0004A720, // GFXMMU_LUT208H - 0x00770001, // GFXMMU_LUT209L - 0x0004AEA0, // GFXMMU_LUT209H - 0x00770001, // GFXMMU_LUT210L - 0x0004B620, // GFXMMU_LUT210H - 0x00770001, // GFXMMU_LUT211L - 0x0004BDA0, // GFXMMU_LUT211H - 0x00770001, // GFXMMU_LUT212L - 0x0004C520, // GFXMMU_LUT212H - 0x00770001, // GFXMMU_LUT213L - 0x0004CCA0, // GFXMMU_LUT213H - 0x00770001, // GFXMMU_LUT214L - 0x0004D420, // GFXMMU_LUT214H - 0x00770001, // GFXMMU_LUT215L - 0x0004DBA0, // GFXMMU_LUT215H - 0x00770001, // GFXMMU_LUT216L - 0x0004E320, // GFXMMU_LUT216H - 0x00770001, // GFXMMU_LUT217L - 0x0004EAA0, // GFXMMU_LUT217H - 0x00770001, // GFXMMU_LUT218L - 0x0004F220, // GFXMMU_LUT218H - 0x00770001, // GFXMMU_LUT219L - 0x0004F9A0, // GFXMMU_LUT219H - 0x00770001, // GFXMMU_LUT220L - 0x00050120, // GFXMMU_LUT220H - 0x00770001, // GFXMMU_LUT221L - 0x000508A0, // GFXMMU_LUT221H - 0x00770001, // GFXMMU_LUT222L - 0x00051020, // GFXMMU_LUT222H - 0x00770001, // GFXMMU_LUT223L - 0x000517A0, // GFXMMU_LUT223H - 0x00770001, // GFXMMU_LUT224L - 0x00051F20, // GFXMMU_LUT224H - 0x00770001, // GFXMMU_LUT225L - 0x000526A0, // GFXMMU_LUT225H - 0x00770001, // GFXMMU_LUT226L - 0x00052E20, // GFXMMU_LUT226H - 0x00770001, // GFXMMU_LUT227L - 0x000535A0, // GFXMMU_LUT227H - 0x00770001, // GFXMMU_LUT228L - 0x00053D20, // GFXMMU_LUT228H - 0x00770001, // GFXMMU_LUT229L - 0x000544A0, // GFXMMU_LUT229H - 0x00770001, // GFXMMU_LUT230L - 0x00054C20, // GFXMMU_LUT230H - 0x00770001, // GFXMMU_LUT231L - 0x000553A0, // GFXMMU_LUT231H - 0x00770001, // GFXMMU_LUT232L - 0x00055B20, // GFXMMU_LUT232H - 0x00770001, // GFXMMU_LUT233L - 0x000562A0, // GFXMMU_LUT233H - 0x00770001, // GFXMMU_LUT234L - 0x00056A20, // GFXMMU_LUT234H - 0x00770001, // GFXMMU_LUT235L - 0x000571A0, // GFXMMU_LUT235H - 0x00770001, // GFXMMU_LUT236L - 0x00057920, // GFXMMU_LUT236H - 0x00770001, // GFXMMU_LUT237L - 0x000580A0, // GFXMMU_LUT237H - 0x00770001, // GFXMMU_LUT238L - 0x00058820, // GFXMMU_LUT238H - 0x00770001, // GFXMMU_LUT239L - 0x00058FA0, // GFXMMU_LUT239H - 0x00780001, // GFXMMU_LUT240L - 0x00059720, // GFXMMU_LUT240H - 0x00770001, // GFXMMU_LUT241L - 0x00059EB0, // GFXMMU_LUT241H - 0x00770001, // GFXMMU_LUT242L - 0x0005A630, // GFXMMU_LUT242H - 0x00770001, // GFXMMU_LUT243L - 0x0005ADB0, // GFXMMU_LUT243H - 0x00770001, // GFXMMU_LUT244L - 0x0005B530, // GFXMMU_LUT244H - 0x00770001, // GFXMMU_LUT245L - 0x0005BCB0, // GFXMMU_LUT245H - 0x00770001, // GFXMMU_LUT246L - 0x0005C430, // GFXMMU_LUT246H - 0x00770001, // GFXMMU_LUT247L - 0x0005CBB0, // GFXMMU_LUT247H - 0x00770001, // GFXMMU_LUT248L - 0x0005D330, // GFXMMU_LUT248H - 0x00770001, // GFXMMU_LUT249L - 0x0005DAB0, // GFXMMU_LUT249H - 0x00770001, // GFXMMU_LUT250L - 0x0005E230, // GFXMMU_LUT250H - 0x00770001, // GFXMMU_LUT251L - 0x0005E9B0, // GFXMMU_LUT251H - 0x00770001, // GFXMMU_LUT252L - 0x0005F130, // GFXMMU_LUT252H - 0x00770001, // GFXMMU_LUT253L - 0x0005F8B0, // GFXMMU_LUT253H - 0x00770001, // GFXMMU_LUT254L - 0x00060030, // GFXMMU_LUT254H - 0x00770001, // GFXMMU_LUT255L - 0x000607B0, // GFXMMU_LUT255H - 0x00770001, // GFXMMU_LUT256L - 0x00060F30, // GFXMMU_LUT256H - 0x00770001, // GFXMMU_LUT257L - 0x000616B0, // GFXMMU_LUT257H - 0x00770001, // GFXMMU_LUT258L - 0x00061E30, // GFXMMU_LUT258H - 0x00770001, // GFXMMU_LUT259L - 0x000625B0, // GFXMMU_LUT259H - 0x00770001, // GFXMMU_LUT260L - 0x00062D30, // GFXMMU_LUT260H - 0x00770001, // GFXMMU_LUT261L - 0x000634B0, // GFXMMU_LUT261H - 0x00770001, // GFXMMU_LUT262L - 0x00063C30, // GFXMMU_LUT262H - 0x00770001, // GFXMMU_LUT263L - 0x000643B0, // GFXMMU_LUT263H - 0x00770001, // GFXMMU_LUT264L - 0x00064B30, // GFXMMU_LUT264H - 0x00770001, // GFXMMU_LUT265L - 0x000652B0, // GFXMMU_LUT265H - 0x00770001, // GFXMMU_LUT266L - 0x00065A30, // GFXMMU_LUT266H - 0x00770001, // GFXMMU_LUT267L - 0x000661B0, // GFXMMU_LUT267H - 0x00770001, // GFXMMU_LUT268L - 0x00066930, // GFXMMU_LUT268H - 0x00770001, // GFXMMU_LUT269L - 0x000670B0, // GFXMMU_LUT269H - 0x00770001, // GFXMMU_LUT270L - 0x00067830, // GFXMMU_LUT270H - 0x00770001, // GFXMMU_LUT271L - 0x00067FB0, // GFXMMU_LUT271H - 0x00770001, // GFXMMU_LUT272L - 0x00068730, // GFXMMU_LUT272H - 0x00770001, // GFXMMU_LUT273L - 0x00068EB0, // GFXMMU_LUT273H - 0x00770001, // GFXMMU_LUT274L - 0x00069630, // GFXMMU_LUT274H - 0x00770001, // GFXMMU_LUT275L - 0x00069DB0, // GFXMMU_LUT275H - 0x00770001, // GFXMMU_LUT276L - 0x0006A530, // GFXMMU_LUT276H - 0x00770001, // GFXMMU_LUT277L - 0x0006ACB0, // GFXMMU_LUT277H - 0x00770001, // GFXMMU_LUT278L - 0x0006B430, // GFXMMU_LUT278H - 0x00770001, // GFXMMU_LUT279L - 0x0006BBB0, // GFXMMU_LUT279H - 0x00770001, // GFXMMU_LUT280L - 0x0006C330, // GFXMMU_LUT280H - 0x00770001, // GFXMMU_LUT281L - 0x0006CAB0, // GFXMMU_LUT281H - 0x00770001, // GFXMMU_LUT282L - 0x0006D230, // GFXMMU_LUT282H - 0x00770001, // GFXMMU_LUT283L - 0x0006D9B0, // GFXMMU_LUT283H - 0x00770001, // GFXMMU_LUT284L - 0x0006E130, // GFXMMU_LUT284H - 0x00760101, // GFXMMU_LUT285L - 0x0006E8A0, // GFXMMU_LUT285H - 0x00760101, // GFXMMU_LUT286L - 0x0006F000, // GFXMMU_LUT286H - 0x00760101, // GFXMMU_LUT287L - 0x0006F760, // GFXMMU_LUT287H - 0x00760101, // GFXMMU_LUT288L - 0x0006FEC0, // GFXMMU_LUT288H - 0x00760101, // GFXMMU_LUT289L - 0x00070620, // GFXMMU_LUT289H - 0x00760101, // GFXMMU_LUT290L - 0x00070D80, // GFXMMU_LUT290H - 0x00760101, // GFXMMU_LUT291L - 0x000714E0, // GFXMMU_LUT291H - 0x00760101, // GFXMMU_LUT292L - 0x00071C40, // GFXMMU_LUT292H - 0x00760101, // GFXMMU_LUT293L - 0x000723A0, // GFXMMU_LUT293H - 0x00760101, // GFXMMU_LUT294L - 0x00072B00, // GFXMMU_LUT294H - 0x00760101, // GFXMMU_LUT295L - 0x00073260, // GFXMMU_LUT295H - 0x00760101, // GFXMMU_LUT296L - 0x000739C0, // GFXMMU_LUT296H - 0x00760101, // GFXMMU_LUT297L - 0x00074120, // GFXMMU_LUT297H - 0x00760101, // GFXMMU_LUT298L - 0x00074880, // GFXMMU_LUT298H - 0x00760101, // GFXMMU_LUT299L - 0x00074FE0, // GFXMMU_LUT299H - 0x00760101, // GFXMMU_LUT300L - 0x00075740, // GFXMMU_LUT300H - 0x00760101, // GFXMMU_LUT301L - 0x00075EA0, // GFXMMU_LUT301H - 0x00760101, // GFXMMU_LUT302L - 0x00076600, // GFXMMU_LUT302H - 0x00750201, // GFXMMU_LUT303L - 0x00076D50, // GFXMMU_LUT303H - 0x00750201, // GFXMMU_LUT304L - 0x00077490, // GFXMMU_LUT304H - 0x00750201, // GFXMMU_LUT305L - 0x00077BD0, // GFXMMU_LUT305H - 0x00750201, // GFXMMU_LUT306L - 0x00078310, // GFXMMU_LUT306H - 0x00750201, // GFXMMU_LUT307L - 0x00078A50, // GFXMMU_LUT307H - 0x00750201, // GFXMMU_LUT308L - 0x00079190, // GFXMMU_LUT308H - 0x00750201, // GFXMMU_LUT309L - 0x000798D0, // GFXMMU_LUT309H - 0x00750201, // GFXMMU_LUT310L - 0x0007A010, // GFXMMU_LUT310H - 0x00750201, // GFXMMU_LUT311L - 0x0007A750, // GFXMMU_LUT311H - 0x00750201, // GFXMMU_LUT312L - 0x0007AE90, // GFXMMU_LUT312H - 0x00750201, // GFXMMU_LUT313L - 0x0007B5D0, // GFXMMU_LUT313H - 0x00750201, // GFXMMU_LUT314L - 0x0007BD10, // GFXMMU_LUT314H - 0x00750201, // GFXMMU_LUT315L - 0x0007C450, // GFXMMU_LUT315H - 0x00740301, // GFXMMU_LUT316L - 0x0007CB80, // GFXMMU_LUT316H - 0x00740301, // GFXMMU_LUT317L - 0x0007D2A0, // GFXMMU_LUT317H - 0x00740301, // GFXMMU_LUT318L - 0x0007D9C0, // GFXMMU_LUT318H - 0x00740301, // GFXMMU_LUT319L - 0x0007E0E0, // GFXMMU_LUT319H - 0x00740301, // GFXMMU_LUT320L - 0x0007E800, // GFXMMU_LUT320H - 0x00740301, // GFXMMU_LUT321L - 0x0007EF20, // GFXMMU_LUT321H - 0x00740301, // GFXMMU_LUT322L - 0x0007F640, // GFXMMU_LUT322H - 0x00740301, // GFXMMU_LUT323L - 0x0007FD60, // GFXMMU_LUT323H - 0x00740301, // GFXMMU_LUT324L - 0x00080480, // GFXMMU_LUT324H - 0x00740301, // GFXMMU_LUT325L - 0x00080BA0, // GFXMMU_LUT325H - 0x00740301, // GFXMMU_LUT326L - 0x000812C0, // GFXMMU_LUT326H - 0x00740301, // GFXMMU_LUT327L - 0x000819E0, // GFXMMU_LUT327H - 0x00730401, // GFXMMU_LUT328L - 0x000820F0, // GFXMMU_LUT328H - 0x00730401, // GFXMMU_LUT329L - 0x000827F0, // GFXMMU_LUT329H - 0x00730401, // GFXMMU_LUT330L - 0x00082EF0, // GFXMMU_LUT330H - 0x00730401, // GFXMMU_LUT331L - 0x000835F0, // GFXMMU_LUT331H - 0x00730401, // GFXMMU_LUT332L - 0x00083CF0, // GFXMMU_LUT332H - 0x00730401, // GFXMMU_LUT333L - 0x000843F0, // GFXMMU_LUT333H - 0x00730401, // GFXMMU_LUT334L - 0x00084AF0, // GFXMMU_LUT334H - 0x00730401, // GFXMMU_LUT335L - 0x000851F0, // GFXMMU_LUT335H - 0x00730401, // GFXMMU_LUT336L - 0x000858F0, // GFXMMU_LUT336H - 0x00730401, // GFXMMU_LUT337L - 0x00085FF0, // GFXMMU_LUT337H - 0x00720501, // GFXMMU_LUT338L - 0x000866E0, // GFXMMU_LUT338H - 0x00720501, // GFXMMU_LUT339L - 0x00086DC0, // GFXMMU_LUT339H - 0x00720501, // GFXMMU_LUT340L - 0x000874A0, // GFXMMU_LUT340H - 0x00720501, // GFXMMU_LUT341L - 0x00087B80, // GFXMMU_LUT341H - 0x00720501, // GFXMMU_LUT342L - 0x00088260, // GFXMMU_LUT342H - 0x00720501, // GFXMMU_LUT343L - 0x00088940, // GFXMMU_LUT343H - 0x00720501, // GFXMMU_LUT344L - 0x00089020, // GFXMMU_LUT344H - 0x00720501, // GFXMMU_LUT345L - 0x00089700, // GFXMMU_LUT345H - 0x00710601, // GFXMMU_LUT346L - 0x00089DD0, // GFXMMU_LUT346H - 0x00710601, // GFXMMU_LUT347L - 0x0008A490, // GFXMMU_LUT347H - 0x00710601, // GFXMMU_LUT348L - 0x0008AB50, // GFXMMU_LUT348H - 0x00710601, // GFXMMU_LUT349L - 0x0008B210, // GFXMMU_LUT349H - 0x00710601, // GFXMMU_LUT350L - 0x0008B8D0, // GFXMMU_LUT350H - 0x00710601, // GFXMMU_LUT351L - 0x0008BF90, // GFXMMU_LUT351H - 0x00710601, // GFXMMU_LUT352L - 0x0008C650, // GFXMMU_LUT352H - 0x00710601, // GFXMMU_LUT353L - 0x0008CD10, // GFXMMU_LUT353H - 0x00700701, // GFXMMU_LUT354L - 0x0008D3C0, // GFXMMU_LUT354H - 0x00700701, // GFXMMU_LUT355L - 0x0008DA60, // GFXMMU_LUT355H - 0x00700701, // GFXMMU_LUT356L - 0x0008E100, // GFXMMU_LUT356H - 0x00700701, // GFXMMU_LUT357L - 0x0008E7A0, // GFXMMU_LUT357H - 0x00700701, // GFXMMU_LUT358L - 0x0008EE40, // GFXMMU_LUT358H - 0x00700701, // GFXMMU_LUT359L - 0x0008F4E0, // GFXMMU_LUT359H - 0x00700701, // GFXMMU_LUT360L - 0x0008FB80, // GFXMMU_LUT360H - 0x006F0801, // GFXMMU_LUT361L - 0x00090210, // GFXMMU_LUT361H - 0x006F0801, // GFXMMU_LUT362L - 0x00090890, // GFXMMU_LUT362H - 0x006F0801, // GFXMMU_LUT363L - 0x00090F10, // GFXMMU_LUT363H - 0x006F0801, // GFXMMU_LUT364L - 0x00091590, // GFXMMU_LUT364H - 0x006F0801, // GFXMMU_LUT365L - 0x00091C10, // GFXMMU_LUT365H - 0x006F0801, // GFXMMU_LUT366L - 0x00092290, // GFXMMU_LUT366H - 0x006F0801, // GFXMMU_LUT367L - 0x00092910, // GFXMMU_LUT367H - 0x006E0901, // GFXMMU_LUT368L - 0x00092F80, // GFXMMU_LUT368H - 0x006E0901, // GFXMMU_LUT369L - 0x000935E0, // GFXMMU_LUT369H - 0x006E0901, // GFXMMU_LUT370L - 0x00093C40, // GFXMMU_LUT370H - 0x006E0901, // GFXMMU_LUT371L - 0x000942A0, // GFXMMU_LUT371H - 0x006E0901, // GFXMMU_LUT372L - 0x00094900, // GFXMMU_LUT372H - 0x006E0901, // GFXMMU_LUT373L - 0x00094F60, // GFXMMU_LUT373H - 0x006D0A01, // GFXMMU_LUT374L - 0x000955B0, // GFXMMU_LUT374H - 0x006D0A01, // GFXMMU_LUT375L - 0x00095BF0, // GFXMMU_LUT375H - 0x006D0A01, // GFXMMU_LUT376L - 0x00096230, // GFXMMU_LUT376H - 0x006D0A01, // GFXMMU_LUT377L - 0x00096870, // GFXMMU_LUT377H - 0x006D0A01, // GFXMMU_LUT378L - 0x00096EB0, // GFXMMU_LUT378H - 0x006C0B01, // GFXMMU_LUT379L - 0x000974E0, // GFXMMU_LUT379H - 0x006C0B01, // GFXMMU_LUT380L - 0x00097B00, // GFXMMU_LUT380H - 0x006C0B01, // GFXMMU_LUT381L - 0x00098120, // GFXMMU_LUT381H - 0x006C0B01, // GFXMMU_LUT382L - 0x00098740, // GFXMMU_LUT382H - 0x006C0B01, // GFXMMU_LUT383L - 0x00098D60, // GFXMMU_LUT383H - 0x006C0B01, // GFXMMU_LUT384L - 0x00099380, // GFXMMU_LUT384H - 0x006B0C01, // GFXMMU_LUT385L - 0x00099990, // GFXMMU_LUT385H - 0x006B0C01, // GFXMMU_LUT386L - 0x00099F90, // GFXMMU_LUT386H - 0x006B0C01, // GFXMMU_LUT387L - 0x0009A590, // GFXMMU_LUT387H - 0x006B0C01, // GFXMMU_LUT388L - 0x0009AB90, // GFXMMU_LUT388H - 0x006B0C01, // GFXMMU_LUT389L - 0x0009B190, // GFXMMU_LUT389H - 0x006A0D01, // GFXMMU_LUT390L - 0x0009B780, // GFXMMU_LUT390H - 0x006A0D01, // GFXMMU_LUT391L - 0x0009BD60, // GFXMMU_LUT391H - 0x006A0D01, // GFXMMU_LUT392L - 0x0009C340, // GFXMMU_LUT392H - 0x006A0D01, // GFXMMU_LUT393L - 0x0009C920, // GFXMMU_LUT393H - 0x006A0D01, // GFXMMU_LUT394L - 0x0009CF00, // GFXMMU_LUT394H - 0x00690E01, // GFXMMU_LUT395L - 0x0009D4D0, // GFXMMU_LUT395H - 0x00690E01, // GFXMMU_LUT396L - 0x0009DA90, // GFXMMU_LUT396H - 0x00690E01, // GFXMMU_LUT397L - 0x0009E050, // GFXMMU_LUT397H - 0x00690E01, // GFXMMU_LUT398L - 0x0009E610, // GFXMMU_LUT398H - 0x00690E01, // GFXMMU_LUT399L - 0x0009EBD0, // GFXMMU_LUT399H - 0x00690E01, // GFXMMU_LUT400L - 0x0009F190, // GFXMMU_LUT400H - 0x00690E01, // GFXMMU_LUT401L - 0x0009F750, // GFXMMU_LUT401H - 0x00680F01, // GFXMMU_LUT402L - 0x0009FD00, // GFXMMU_LUT402H - 0x00680F01, // GFXMMU_LUT403L - 0x000A02A0, // GFXMMU_LUT403H - 0x00680F01, // GFXMMU_LUT404L - 0x000A0840, // GFXMMU_LUT404H - 0x00680F01, // GFXMMU_LUT405L - 0x000A0DE0, // GFXMMU_LUT405H - 0x00671001, // GFXMMU_LUT406L - 0x000A1370, // GFXMMU_LUT406H - 0x00671001, // GFXMMU_LUT407L - 0x000A18F0, // GFXMMU_LUT407H - 0x00671001, // GFXMMU_LUT408L - 0x000A1E70, // GFXMMU_LUT408H - 0x00671001, // GFXMMU_LUT409L - 0x000A23F0, // GFXMMU_LUT409H - 0x00661101, // GFXMMU_LUT410L - 0x000A2960, // GFXMMU_LUT410H - 0x00661101, // GFXMMU_LUT411L - 0x000A2EC0, // GFXMMU_LUT411H - 0x00661101, // GFXMMU_LUT412L - 0x000A3420, // GFXMMU_LUT412H - 0x00661101, // GFXMMU_LUT413L - 0x000A3980, // GFXMMU_LUT413H - 0x00651201, // GFXMMU_LUT414L - 0x000A3ED0, // GFXMMU_LUT414H - 0x00651201, // GFXMMU_LUT415L - 0x000A4410, // GFXMMU_LUT415H - 0x00651201, // GFXMMU_LUT416L - 0x000A4950, // GFXMMU_LUT416H - 0x00641301, // GFXMMU_LUT417L - 0x000A4E80, // GFXMMU_LUT417H - 0x00641301, // GFXMMU_LUT418L - 0x000A53A0, // GFXMMU_LUT418H - 0x00641301, // GFXMMU_LUT419L - 0x000A58C0, // GFXMMU_LUT419H - 0x00641301, // GFXMMU_LUT420L - 0x000A5DE0, // GFXMMU_LUT420H - 0x00631401, // GFXMMU_LUT421L - 0x000A62F0, // GFXMMU_LUT421H - 0x00631401, // GFXMMU_LUT422L - 0x000A67F0, // GFXMMU_LUT422H - 0x00631401, // GFXMMU_LUT423L - 0x000A6CF0, // GFXMMU_LUT423H - 0x00621501, // GFXMMU_LUT424L - 0x000A71E0, // GFXMMU_LUT424H - 0x00621501, // GFXMMU_LUT425L - 0x000A76C0, // GFXMMU_LUT425H - 0x00621501, // GFXMMU_LUT426L - 0x000A7BA0, // GFXMMU_LUT426H - 0x00621501, // GFXMMU_LUT427L - 0x000A8080, // GFXMMU_LUT427H - 0x00611601, // GFXMMU_LUT428L - 0x000A8550, // GFXMMU_LUT428H - 0x00611601, // GFXMMU_LUT429L - 0x000A8A10, // GFXMMU_LUT429H - 0x00611601, // GFXMMU_LUT430L - 0x000A8ED0, // GFXMMU_LUT430H - 0x00601701, // GFXMMU_LUT431L - 0x000A9380, // GFXMMU_LUT431H - 0x00601701, // GFXMMU_LUT432L - 0x000A9820, // GFXMMU_LUT432H - 0x00601701, // GFXMMU_LUT433L - 0x000A9CC0, // GFXMMU_LUT433H - 0x005F1801, // GFXMMU_LUT434L - 0x000AA150, // GFXMMU_LUT434H - 0x005F1801, // GFXMMU_LUT435L - 0x000AA5D0, // GFXMMU_LUT435H - 0x005F1801, // GFXMMU_LUT436L - 0x000AAA50, // GFXMMU_LUT436H - 0x005E1901, // GFXMMU_LUT437L - 0x000AAEC0, // GFXMMU_LUT437H - 0x005E1901, // GFXMMU_LUT438L - 0x000AB320, // GFXMMU_LUT438H - 0x005D1A01, // GFXMMU_LUT439L - 0x000AB770, // GFXMMU_LUT439H - 0x005D1A01, // GFXMMU_LUT440L - 0x000ABBB0, // GFXMMU_LUT440H - 0x005D1A01, // GFXMMU_LUT441L - 0x000ABFF0, // GFXMMU_LUT441H - 0x005C1B01, // GFXMMU_LUT442L - 0x000AC420, // GFXMMU_LUT442H - 0x005C1B01, // GFXMMU_LUT443L - 0x000AC840, // GFXMMU_LUT443H - 0x005B1C01, // GFXMMU_LUT444L - 0x000ACC50, // GFXMMU_LUT444H - 0x005B1C01, // GFXMMU_LUT445L - 0x000AD050, // GFXMMU_LUT445H - 0x005B1C01, // GFXMMU_LUT446L - 0x000AD450, // GFXMMU_LUT446H - 0x005A1D01, // GFXMMU_LUT447L - 0x000AD840, // GFXMMU_LUT447H - 0x005A1D01, // GFXMMU_LUT448L - 0x000ADC20, // GFXMMU_LUT448H - 0x00591E01, // GFXMMU_LUT449L - 0x000ADFF0, // GFXMMU_LUT449H - 0x00591E01, // GFXMMU_LUT450L - 0x000AE3B0, // GFXMMU_LUT450H - 0x00581F01, // GFXMMU_LUT451L - 0x000AE760, // GFXMMU_LUT451H - 0x00581F01, // GFXMMU_LUT452L - 0x000AEB00, // GFXMMU_LUT452H - 0x00572001, // GFXMMU_LUT453L - 0x000AEE90, // GFXMMU_LUT453H - 0x00572001, // GFXMMU_LUT454L - 0x000AF210, // GFXMMU_LUT454H - 0x00562101, // GFXMMU_LUT455L - 0x000AF580, // GFXMMU_LUT455H - 0x00562101, // GFXMMU_LUT456L - 0x000AF8E0, // GFXMMU_LUT456H - 0x00552201, // GFXMMU_LUT457L - 0x000AFC30, // GFXMMU_LUT457H - 0x00552201, // GFXMMU_LUT458L - 0x000AFF70, // GFXMMU_LUT458H - 0x00542301, // GFXMMU_LUT459L - 0x000B02A0, // GFXMMU_LUT459H - 0x00542301, // GFXMMU_LUT460L - 0x000B05C0, // GFXMMU_LUT460H - 0x00532401, // GFXMMU_LUT461L - 0x000B08D0, // GFXMMU_LUT461H - 0x00522501, // GFXMMU_LUT462L - 0x000B0BC0, // GFXMMU_LUT462H - 0x00522501, // GFXMMU_LUT463L - 0x000B0EA0, // GFXMMU_LUT463H - 0x00512601, // GFXMMU_LUT464L - 0x000B1170, // GFXMMU_LUT464H - 0x00502701, // GFXMMU_LUT465L - 0x000B1420, // GFXMMU_LUT465H - 0x00502701, // GFXMMU_LUT466L - 0x000B16C0, // GFXMMU_LUT466H - 0x004F2801, // GFXMMU_LUT467L - 0x000B1950, // GFXMMU_LUT467H - 0x004E2901, // GFXMMU_LUT468L - 0x000B1BC0, // GFXMMU_LUT468H - 0x004D2A01, // GFXMMU_LUT469L - 0x000B1E10, // GFXMMU_LUT469H - 0x004D2A01, // GFXMMU_LUT470L - 0x000B2050, // GFXMMU_LUT470H - 0x004C2B01, // GFXMMU_LUT471L - 0x000B2280, // GFXMMU_LUT471H - 0x004B2C01, // GFXMMU_LUT472L - 0x000B2490, // GFXMMU_LUT472H - 0x004A2D01, // GFXMMU_LUT473L - 0x000B2680, // GFXMMU_LUT473H - 0x00492E01, // GFXMMU_LUT474L - 0x000B2850, // GFXMMU_LUT474H - 0x00482F01, // GFXMMU_LUT475L - 0x000B2A00, // GFXMMU_LUT475H - 0x00463101, // GFXMMU_LUT476L - 0x000B2B80, // GFXMMU_LUT476H - 0x00453201, // GFXMMU_LUT477L - 0x000B2CD0, // GFXMMU_LUT477H - 0x00433401, // GFXMMU_LUT478L - 0x000B2DF0, // GFXMMU_LUT478H - 0x00413601, // GFXMMU_LUT479L - 0x000B2ED0 // GFXMMU_LUT479H -}; - -#ifdef __cplusplus -} -#endif -#endif /*__ gfxmmu_lut_H */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/core/embed/trezorhal/stm32u5/displays/panels/lx154a2422.c b/core/embed/trezorhal/stm32u5/displays/panels/lx154a2422.c deleted file mode 120000 index 9a06799343..0000000000 --- a/core/embed/trezorhal/stm32u5/displays/panels/lx154a2422.c +++ /dev/null @@ -1 +0,0 @@ -../../../stm32f4/displays/panels/lx154a2422.c \ No newline at end of file diff --git a/core/embed/trezorhal/stm32u5/displays/panels/lx154a2422.h b/core/embed/trezorhal/stm32u5/displays/panels/lx154a2422.h deleted file mode 120000 index 3bff068489..0000000000 --- a/core/embed/trezorhal/stm32u5/displays/panels/lx154a2422.h +++ /dev/null @@ -1 +0,0 @@ -../../../stm32f4/displays/panels/lx154a2422.h \ No newline at end of file diff --git a/core/embed/trezorhal/stm32u5/displays/panels/lx154a2482.c b/core/embed/trezorhal/stm32u5/displays/panels/lx154a2482.c deleted file mode 100644 index 3ce189a3ff..0000000000 --- a/core/embed/trezorhal/stm32u5/displays/panels/lx154a2482.c +++ /dev/null @@ -1,179 +0,0 @@ - -#include "display.h" -#include "displays/st7789v.h" -#include "touch.h" - -void lx154a2482_gamma(void) { - // positive voltage correction - CMD(0xE0); - DATA(0xD0); - DATA(0x0A); - DATA(0x10); - DATA(0x0A); - DATA(0x0A); - DATA(0x26); - DATA(0x36); - DATA(0x34); - DATA(0x4D); - DATA(0x18); - DATA(0x13); - DATA(0x14); - DATA(0x2F); - DATA(0x34); - - // negative voltage correction - CMD(0xE1); - DATA(0xD0); - DATA(0x0A); - DATA(0x10); - DATA(0x0A); - DATA(0x09); - DATA(0x26); - DATA(0x36); - DATA(0x53); - DATA(0x4C); - DATA(0x18); - DATA(0x14); - DATA(0x14); - DATA(0x2F); - DATA(0x34); -} - -void lx154a2482_init_seq(void) { - // TEON: Tearing Effect Line On; V-blanking only - CMD(0x35); - DATA(0x00); - - // Memory Data Access Control (MADCTL) - CMD(0x36); - DATA(0x00); - - // Interface Pixel Format - CMD(0x3A); - DATA(0x05); - - // Column Address Set - CMD(0x2A); - DATA(0x00); - DATA(0x00); - DATA(0x00); - DATA(0xEF); - - // Row Address Set - CMD(0x2B); - DATA(0x00); - DATA(0x00); - DATA(0x00); - DATA(0xEF); - - // Porch Setting - CMD(0xB2); - DATA(0x0C); - DATA(0x0C); - DATA(0x00); - DATA(0x33); - DATA(0x33); - - // VCOM Setting - CMD(0xBB); - DATA(0x1F); - - // LCMCTRL: LCM Control: XOR RGB setting - CMD(0xC0); - DATA(0x20); - - // VDV and VRH Command Enable - CMD(0xC2); - DATA(0x01); - - // VRH Set - CMD(0xC3); - DATA(0x0F); // 4.3V - - // VDV Setting - CMD(0xC4); - DATA(0x20); - - // Frame Rate Control in Normal Mode - CMD(0xC6); - DATA(0xEF); // column inversion //0X0F Dot INV, 60Hz - - // GATECTRL: Gate Control; NL = 240 gate lines, first scan line is gate 80.; - // gate scan direction 319 -> 0 - CMD(0xE4); - DATA(0x1D); - DATA(0x0A); - DATA(0x11); - - // INVOFF (20h): Display Inversion Off - // INVON (21h): Display Inversion On - CMD(0x21); - // the above config is the most important and definitely necessary - - // PWCTRL1: Power Control 1 - CMD(0xD0); - DATA(0xA4); - DATA(0xA1); - - lx154a2482_gamma(); -} - -void lx154a2482_rotate(int degrees, display_padding_t* padding) { - uint16_t shift = 0; - char BX = 0, BY = 0; - -#define RGB (1 << 3) -#define ML (1 << 4) // vertical refresh order -#define MH (1 << 2) // horizontal refresh order -#define MV (1 << 5) -#define MX (1 << 6) -#define MY (1 << 7) - // MADCTL: Memory Data Access Control - reference: - // section 8.12 in the ST7789V manual - uint8_t display_command_parameter = 0; - switch (degrees) { - case 0: - display_command_parameter = 0; - BY = 0; - break; - case 90: - display_command_parameter = MV | MX | MH | ML; - BX = 1; - shift = 1; - break; - case 180: - display_command_parameter = MX | MY | MH | ML; - BY = 0; - shift = 1; - break; - case 270: - display_command_parameter = MV | MY; - BX = 1; - break; - } - - CMD(0x36); - DATA(display_command_parameter); - - if (shift) { - // GATECTRL: Gate Control; NL = 240 gate lines, first scan line is - // gate 80.; gate scan direction 319 -> 0 - CMD(0xE4); - DATA(0x1D); - DATA(0x00); - DATA(0x11); - } else { - // GATECTRL: Gate Control; NL = 240 gate lines, first scan line is - // gate 80.; gate scan direction 319 -> 0 - CMD(0xE4); - DATA(0x1D); - DATA(0x0A); - DATA(0x11); - } - - // reset the column and page extents - display_set_window(0, 0, DISPLAY_RESX - 1, DISPLAY_RESY - 1); - - padding->x = BX ? (MAX_DISPLAY_RESY - DISPLAY_RESY) : 0; - padding->y = BY ? (MAX_DISPLAY_RESY - DISPLAY_RESY) : 0; -} diff --git a/core/embed/trezorhal/stm32u5/displays/panels/lx154a2482.h b/core/embed/trezorhal/stm32u5/displays/panels/lx154a2482.h deleted file mode 100644 index fa1f6eab10..0000000000 --- a/core/embed/trezorhal/stm32u5/displays/panels/lx154a2482.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef LX154A2422_H_ -#define LX154A2422_H_ - -#include "displays/st7789v.h" - -void lx154a2482_init_seq(void); -void lx154a2482_gamma(void); -void lx154a2482_rotate(int degrees, display_padding_t* padding); - -#endif diff --git a/core/embed/trezorhal/stm32u5/displays/st7789v.c b/core/embed/trezorhal/stm32u5/displays/st7789v.c deleted file mode 120000 index 5f8dcd4cb6..0000000000 --- a/core/embed/trezorhal/stm32u5/displays/st7789v.c +++ /dev/null @@ -1 +0,0 @@ -../../stm32f4/displays/st7789v.c \ No newline at end of file diff --git a/core/embed/trezorhal/stm32u5/displays/st7789v.h b/core/embed/trezorhal/stm32u5/displays/st7789v.h deleted file mode 120000 index 7974c7d91f..0000000000 --- a/core/embed/trezorhal/stm32u5/displays/st7789v.h +++ /dev/null @@ -1 +0,0 @@ -../../stm32f4/displays/st7789v.h \ No newline at end of file diff --git a/core/embed/trezorhal/stm32u5/displays/vg-2864ksweg01.c b/core/embed/trezorhal/stm32u5/displays/vg-2864ksweg01.c deleted file mode 120000 index 4a0a88bfeb..0000000000 --- a/core/embed/trezorhal/stm32u5/displays/vg-2864ksweg01.c +++ /dev/null @@ -1 +0,0 @@ -../../stm32f4/displays/vg-2864ksweg01.c \ No newline at end of file diff --git a/core/embed/trezorhal/stm32u5/displays/vg-2864ksweg01.h b/core/embed/trezorhal/stm32u5/displays/vg-2864ksweg01.h deleted file mode 120000 index f57ce0f36c..0000000000 --- a/core/embed/trezorhal/stm32u5/displays/vg-2864ksweg01.h +++ /dev/null @@ -1 +0,0 @@ -../../stm32f4/displays/vg-2864ksweg01.h \ No newline at end of file diff --git a/core/embed/trezorhal/stm32u5/dma2d.c b/core/embed/trezorhal/stm32u5/dma2d.c deleted file mode 120000 index 449adb7584..0000000000 --- a/core/embed/trezorhal/stm32u5/dma2d.c +++ /dev/null @@ -1 +0,0 @@ -../stm32f4/dma2d.c \ No newline at end of file diff --git a/core/embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_driver.c b/core/embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_driver.c index ad95f44c5a..559db2db5e 100644 --- a/core/embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_driver.c +++ b/core/embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_driver.c @@ -18,11 +18,12 @@ */ #include +#include #include +#include "display.h" #include "display_internal.h" #include "mpu.h" -#include "xdisplay.h" #if (DISPLAY_RESX != 240) || (DISPLAY_RESY != 240) #error "Incompatible display resolution" diff --git a/core/embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_fb.c b/core/embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_fb.c index 75195aa8fa..f24e2baf99 100644 --- a/core/embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_fb.c +++ b/core/embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_fb.c @@ -18,9 +18,10 @@ */ #include +#include #include -#include +#include "display.h" #include "display_internal.h" #include "mpu.h" #include "trustzone.h" diff --git a/core/embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_ltdc_dsi.c b/core/embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_ltdc_dsi.c index 49d3f79a3b..f2c98ae102 100644 --- a/core/embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_ltdc_dsi.c +++ b/core/embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_ltdc_dsi.c @@ -61,7 +61,6 @@ #include #include -#include "colors.h" #include "display_internal.h" #include "irq.h" diff --git a/core/embed/trezorhal/unix/display-unix.c b/core/embed/trezorhal/unix/display-unix.c deleted file mode 100644 index 7fd62fb3fb..0000000000 --- a/core/embed/trezorhal/unix/display-unix.c +++ /dev/null @@ -1,300 +0,0 @@ -/* - * This file is part of the Trezor project, https://trezor.io/ - * - * Copyright (c) SatoshiLabs - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -#define _GNU_SOURCE - -#include -#include - -#include -#include - -#include -#include - -#include "display.h" -#include "profile.h" - -#define EMULATOR_BORDER 16 - -static SDL_Window *WINDOW; -static SDL_Renderer *RENDERER; -static SDL_Surface *BUFFER; -static SDL_Texture *TEXTURE, *BACKGROUND; - -static SDL_Surface *PREV_SAVED; - -static int DISPLAY_BACKLIGHT = -1; -static int DISPLAY_ORIENTATION = -1; - -int sdl_display_res_x = DISPLAY_RESX, sdl_display_res_y = DISPLAY_RESY; -int sdl_touch_offset_x, sdl_touch_offset_y; - -// Using RGB565 (16-bit) color format. -typedef uint16_t pixel_color; - -// this is just for compatibility with DMA2D using algorithms -uint8_t *const DISPLAY_DATA_ADDRESS = 0; - -static struct { - struct { - uint16_t x, y; - } start; - struct { - uint16_t x, y; - } end; - struct { - uint16_t x, y; - } pos; -} PIXELWINDOW; - -void display_pixeldata(pixel_color c) { -#if !defined USE_RGB_COLORS - // set to white if highest bits of all R, G, B values are set to 1 - // bin(10000 100000 10000) = hex(0x8410) - // otherwise set to black - c = (c & 0x8410) ? 0xFFFF : 0x0000; -#endif - if (!RENDERER) { - display_init_all(); - } - if (PIXELWINDOW.pos.x <= PIXELWINDOW.end.x && - PIXELWINDOW.pos.y <= PIXELWINDOW.end.y) { - ((pixel_color *) - BUFFER->pixels)[PIXELWINDOW.pos.x + PIXELWINDOW.pos.y * BUFFER->pitch / - sizeof(pixel_color)] = c; - } - PIXELWINDOW.pos.x++; - if (PIXELWINDOW.pos.x > PIXELWINDOW.end.x) { - PIXELWINDOW.pos.x = PIXELWINDOW.start.x; - PIXELWINDOW.pos.y++; - } -} - -void display_pixeldata_dirty(void) {} - -void display_reset_state() {} - -void display_init_seq(void) {} - -void display_exit_handler(void) { - SDL_FreeSurface(PREV_SAVED); - SDL_FreeSurface(BUFFER); - if (BACKGROUND != NULL) { - SDL_DestroyTexture(BACKGROUND); - } - if (TEXTURE != NULL) { - SDL_DestroyTexture(TEXTURE); - } - if (RENDERER != NULL) { - SDL_DestroyRenderer(RENDERER); - } - if (WINDOW != NULL) { - SDL_DestroyWindow(WINDOW); - } - SDL_Quit(); -} - -void display_init_all(void) { - if (SDL_Init(SDL_INIT_VIDEO) != 0) { - printf("%s\n", SDL_GetError()); - error_shutdown("SDL_Init error"); - } - atexit(display_exit_handler); - - char *window_title = NULL; - char *window_title_alloc = NULL; - if (asprintf(&window_title_alloc, "Trezor^emu: %s", profile_name()) > 0) { - window_title = window_title_alloc; - } else { - window_title = "Trezor^emu"; - window_title_alloc = NULL; - } - - WINDOW = - SDL_CreateWindow(window_title, SDL_WINDOWPOS_UNDEFINED, - SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT, -#ifdef TREZOR_EMULATOR_RASPI - SDL_WINDOW_SHOWN | SDL_WINDOW_FULLSCREEN -#else - SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI -#endif - ); - free(window_title_alloc); - if (!WINDOW) { - printf("%s\n", SDL_GetError()); - error_shutdown("SDL_CreateWindow error"); - } - RENDERER = SDL_CreateRenderer(WINDOW, -1, SDL_RENDERER_SOFTWARE); - if (!RENDERER) { - printf("%s\n", SDL_GetError()); - SDL_DestroyWindow(WINDOW); - error_shutdown("SDL_CreateRenderer error"); - } - SDL_SetRenderDrawColor(RENDERER, 0, 0, 0, 255); - SDL_RenderClear(RENDERER); - BUFFER = SDL_CreateRGBSurface(0, DISPLAY_RESX, DISPLAY_RESY, 16, 0xF800, - 0x07E0, 0x001F, 0x0000); - TEXTURE = SDL_CreateTexture(RENDERER, SDL_PIXELFORMAT_RGB565, - SDL_TEXTUREACCESS_STREAMING, DISPLAY_RESX, - DISPLAY_RESY); - SDL_SetTextureBlendMode(TEXTURE, SDL_BLENDMODE_BLEND); -#ifdef __APPLE__ - // macOS Mojave SDL black screen workaround - SDL_PumpEvents(); - SDL_SetWindowSize(WINDOW, WINDOW_WIDTH, WINDOW_HEIGHT); -#endif -#include BACKGROUND_FILE -#define CONCAT_LEN_HELPER(name) name##_len -#define CONCAT_LEN(name) CONCAT_LEN_HELPER(name) - BACKGROUND = IMG_LoadTexture_RW( - RENDERER, SDL_RWFromMem(BACKGROUND_NAME, CONCAT_LEN(BACKGROUND_NAME)), 0); - if (BACKGROUND) { - SDL_SetTextureBlendMode(BACKGROUND, SDL_BLENDMODE_NONE); - sdl_touch_offset_x = TOUCH_OFFSET_X; - sdl_touch_offset_y = TOUCH_OFFSET_Y; - } else { - SDL_SetWindowSize(WINDOW, DISPLAY_RESX + 2 * EMULATOR_BORDER, - DISPLAY_RESY + 2 * EMULATOR_BORDER); - sdl_touch_offset_x = EMULATOR_BORDER; - sdl_touch_offset_y = EMULATOR_BORDER; - } -#if !USE_BACKLIGHT - // some models do not have backlight capabilities in hardware, so - // setting its value here for emulator to avoid - // calling any `set_backlight` functions - DISPLAY_BACKLIGHT = 255; -#else - DISPLAY_BACKLIGHT = 0; -#endif -#ifdef TREZOR_EMULATOR_RASPI - DISPLAY_ORIENTATION = 270; - SDL_ShowCursor(SDL_DISABLE); -#else - DISPLAY_ORIENTATION = 0; -#endif -} - -void display_set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { - if (!RENDERER) { - display_init_all(); - } - PIXELWINDOW.start.x = x0; - PIXELWINDOW.start.y = y0; - PIXELWINDOW.end.x = x1; - PIXELWINDOW.end.y = y1; - PIXELWINDOW.pos.x = x0; - PIXELWINDOW.pos.y = y0; -} - -void display_sync(void) {} - -void display_refresh(void) { - if (!RENDERER) { - display_init_all(); - } - if (BACKGROUND) { - const SDL_Rect r = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; - SDL_RenderCopy(RENDERER, BACKGROUND, NULL, &r); - } else { - SDL_RenderClear(RENDERER); - } - // Show the display buffer - SDL_UpdateTexture(TEXTURE, NULL, BUFFER->pixels, BUFFER->pitch); -#define BACKLIGHT_NORMAL 150 - SDL_SetTextureAlphaMod(TEXTURE, - MIN(255, 255 * DISPLAY_BACKLIGHT / BACKLIGHT_NORMAL)); - if (BACKGROUND) { - const SDL_Rect r = {TOUCH_OFFSET_X, TOUCH_OFFSET_Y, DISPLAY_RESX, - DISPLAY_RESY}; - SDL_RenderCopyEx(RENDERER, TEXTURE, NULL, &r, DISPLAY_ORIENTATION, NULL, 0); - } else { - const SDL_Rect r = {EMULATOR_BORDER, EMULATOR_BORDER, DISPLAY_RESX, - DISPLAY_RESY}; - SDL_RenderCopyEx(RENDERER, TEXTURE, NULL, &r, DISPLAY_ORIENTATION, NULL, 0); - } - SDL_RenderPresent(RENDERER); -} - -int display_orientation(int degrees) { - if (degrees != DISPLAY_ORIENTATION) { -#if defined ORIENTATION_NSEW - if (degrees == 0 || degrees == 90 || degrees == 180 || degrees == 270) { -#elif defined ORIENTATION_NS - if (degrees == 0 || degrees == 180) { -#else - if (degrees == 0) { -#endif - DISPLAY_ORIENTATION = degrees; - display_refresh(); - } - } - return DISPLAY_ORIENTATION; -} - -int display_get_orientation(void) { return DISPLAY_ORIENTATION; } - -int display_backlight(int val) { -#if !USE_BACKLIGHT - val = 255; -#endif - if (DISPLAY_BACKLIGHT != val && val >= 0 && val <= 255) { - DISPLAY_BACKLIGHT = val; - display_refresh(); - } - return DISPLAY_BACKLIGHT; -} - -const char *display_save(const char *prefix) { - if (!RENDERER) { - display_init_all(); - } - static int count; - static char filename[256]; - // take a cropped view of the screen contents - const SDL_Rect rect = {0, 0, DISPLAY_RESX, DISPLAY_RESY}; - SDL_Surface *crop = SDL_CreateRGBSurface( - BUFFER->flags, rect.w, rect.h, BUFFER->format->BitsPerPixel, - BUFFER->format->Rmask, BUFFER->format->Gmask, BUFFER->format->Bmask, - BUFFER->format->Amask); - SDL_BlitSurface(BUFFER, &rect, crop, NULL); - // compare with previous screen, skip if equal - if (PREV_SAVED != NULL) { - if (memcmp(PREV_SAVED->pixels, crop->pixels, crop->pitch * crop->h) == 0) { - SDL_FreeSurface(crop); - return filename; - } - SDL_FreeSurface(PREV_SAVED); - } - // save to png - snprintf(filename, sizeof(filename), "%s%08d.png", prefix, count++); - IMG_SavePNG(crop, filename); - PREV_SAVED = crop; - return filename; -} - -void display_clear_save(void) { - SDL_FreeSurface(PREV_SAVED); - PREV_SAVED = NULL; -} - -uint8_t *display_get_wr_addr(void) { return (uint8_t *)DISPLAY_DATA_ADDRESS; } - -void display_finish_actions(void) {} - -void display_reinit(void) {} diff --git a/core/embed/trezorhal/unix/display_driver.c b/core/embed/trezorhal/unix/display_driver.c index 2ad3e56525..8eecfa45a6 100644 --- a/core/embed/trezorhal/unix/display_driver.c +++ b/core/embed/trezorhal/unix/display_driver.c @@ -20,9 +20,10 @@ #define _GNU_SOURCE #include +#include #include -#include +#include "display.h" #include #include diff --git a/core/embed/trezorhal/xdisplay.h b/core/embed/trezorhal/xdisplay.h deleted file mode 100644 index dfd3cf75df..0000000000 --- a/core/embed/trezorhal/xdisplay.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - * This file is part of the Trezor project, https://trezor.io/ - * - * Copyright (c) SatoshiLabs - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef TREZORHAL_XDISPLAY_H -#define TREZORHAL_XDISPLAY_H - -#include - -#include "gfx_bitblt.h" - -// This is a universal API for controlling different types of display -// controllers. -// -// Currently, following displays displays are supported -// -// VG-2864KSWEG01 - OLED Mono / 128x64 pixels / SPI -// - Model T2B1 -// -// UG-2828SWIG01 - OLED Mono / 128x128 pixels / Parallel -// - Early revisions of T2B1 -// -// ST7789V - TFT RGB / 240x240 pixels / Parallel -// - Model T2T1 / Model T3T1 -// -// ILI9341 - TFT RGB / 320x240 pixels / Parallel / LTDC + SPI -// - STM32F429I-DISC1 Discovery Board -// -// MIPI - -// - STM32U5A9J-DK Discovery Board - -#ifdef KERNEL_MODE - -// Specifies how display content should be handled during -// initialization or deinitialization. -typedef enum { - // Clear the display content - DISPLAY_RESET_CONTENT, - // Retain the display content - DISPLAY_RETAIN_CONTENT -} display_content_mode_t; - -// Initializes the display controller. -// -// If `mode` is `DISPLAY_RETAIN_CONTENT`, ensure the driver was previously -// initialized and `display_deinit(DISPLAY_RETAIN_CONTENT)` was called. -void display_init(display_content_mode_t mode); - -// Deinitializes the display controller. -// -// If `mode` is `DISPLAY_RETAIN_CONTENT`, the function waits for -// background operations to complete and disables interrupts, so the -// application can safely proceed to the next boot stage and call -// `display_init(DISPLAY_RETAIN_CONTENT)`. -void display_deinit(display_content_mode_t mode); - -// Allows unprivileged access to the display framebuffer from -// perspective of the GTZC (Global TrustZone Controller). -void display_set_unpriv_access(bool unpriv); - -#endif // KERNEL_MODE - -// Sets display backlight level ranging from 0 (off)..255 (maximum). -// -// The default backligt level is 0. Without settings it -// to some higher value the displayed pixels are not visible. -// Beware that his also applies to the emulator. -// -// Returns the set level (usually the same value or the -// closest value to the `level` argument) -int display_set_backlight(int level); - -// Gets current display level ranging from 0 (off)..255 (maximum). -int display_get_backlight(void); - -// Sets the display orientation. -// -// May accept one of following values: 0, 90, 180, 270 -// but accepted values are model-dependent. -// Default display orientation is always 0. -// -// Returns the set orientation -int display_set_orientation(int angle); - -// Gets the display's current orientation -// -// Returned value is one of 0, 90, 180, 270. -int display_get_orientation(void); - -#ifdef XFRAMEBUFFER - -typedef struct { - // Pointer to the top-left pixel - void *ptr; - // Stride in bytes - size_t stride; - -} display_fb_info_t; - -// Provides pointer to the inactive (writeable) framebuffer. -// -// If framebuffer is not available yet due to display refreshing etc., -// the function may block until the buffer is ready to write. -// -// Return `false` if the framebuffer is not available. -bool display_get_frame_buffer(display_fb_info_t *fb); - -#else // XFRAMEBUFFER - -// Waits for the vertical synchronization pulse. -// -// Used for synchronization with the display refresh cycle -// to achieve tearless UX if possible when not using a frame buffer. -void display_wait_for_sync(void); -#endif - -// Swaps the frame buffers -// -// The function waits for vertical synchronization and -// swaps the active (currently displayed) and the inactive frame buffers. -void display_refresh(void); - -// Following functions define display's bitblt interface. -// -// These functions draw directly to to display or to the -// currently inactive framebuffer. -// -// bb->dst_row and bb->dst_stride must be 0 - -// Fills a rectangle with a solid color. -// This function is supported by all types of displays. -void display_fill(const gfx_bitblt_t *bb); -// Copies an RGB565 bitmap. -// This function is supported by RGB displays only. -void display_copy_rgb565(const gfx_bitblt_t *bb); -// Copies a MONO4 bitmap (supported only with RGB displays). -// This function is supported by RGB displays only. -void display_copy_mono4(const gfx_bitblt_t *bb); -// Copies a MONO1P bitmap. -// This function is supported by all types of displays. -void display_copy_mono1p(const gfx_bitblt_t *bb); - -#ifdef TREZOR_EMULATOR -// Save the screen content to a file. -// The function is available only on the emulator. -const char *display_save(const char *prefix); -void display_clear_save(void); -#endif - -// Adds some declarations needed to compile with the legacy code -// (will be removed with the display legacy code) -#include "xdisplay_legacy.h" - -#endif // TREZORHAL_XDISPLAY_H diff --git a/core/embed/trezorhal/xdisplay_legacy.c b/core/embed/trezorhal/xdisplay_legacy.c deleted file mode 100644 index 8f63db4bc9..0000000000 --- a/core/embed/trezorhal/xdisplay_legacy.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This file is part of the Trezor project, https://trezor.io/ - * - * Copyright (c) SatoshiLabs - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "xdisplay_legacy.h" -#include "xdisplay.h" - -// This code emulates the legacy display interface and will be -// removed after final cleanup of display drivers when the legacy code -// is removed. - -int display_orientation(int angle) { - if (angle >= 0) { - return display_set_orientation(angle); - } else { - return display_get_orientation(); - } -} - -int display_backlight(int level) { - if (level >= 0) { - return display_set_backlight(level); - } else { - return display_get_backlight(); - } -} - -void display_sync(void) { -#ifndef XFRAMEBUFFER - display_wait_for_sync(); -#endif -} diff --git a/core/embed/trezorhal/xdisplay_legacy.h b/core/embed/trezorhal/xdisplay_legacy.h deleted file mode 100644 index 39766895e5..0000000000 --- a/core/embed/trezorhal/xdisplay_legacy.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * This file is part of the Trezor project, https://trezor.io/ - * - * Copyright (c) SatoshiLabs - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef TREZORHAL_DISPLAY_LEGACY_H -#define TREZORHAL_DISPLAY_LEGACY_H - -#include - -#include "buffers.h" - -// These declarations will be removed after the final cleanup -// of display drivers. They are here just to simplify integration -// with the legacy code. -// -// Most of these functions are not called when NEW_RENDERING=1, -// and they are only needed for successful code compilation. - -#define DISPLAY_FRAMEBUFFER_WIDTH 768 -#define DISPLAY_FRAMEBUFFER_HEIGHT 480 -#define DISPLAY_FRAMEBUFFER_OFFSET_X 0 -#define DISPLAY_FRAMEBUFFER_OFFSET_Y 0 - -int display_orientation(int angle); -int display_backlight(int level); -void display_refresh(void); -void display_shift_window(uint16_t pixels); -uint16_t display_get_window_offset(void); -void display_pixeldata_dirty(void); -uint8_t* display_get_wr_addr(void); -void display_sync(void); -void display_set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); -void display_pixeldata(uint16_t c); -uint32_t* display_get_fb_addr(void); - -void display_clear(void); -void display_text_render_buffer(const char* text, int textlen, int font, - buffer_text_t* buffer, int text_offset); - -#define PIXELDATA(c) display_pixeldata(c) - -#endif // TREZORHAL_DISPLAY_LEGACY_H diff --git a/core/site_scons/models/D001/discovery.py b/core/site_scons/models/D001/discovery.py index 581f0dbbff..f5cd4ab544 100644 --- a/core/site_scons/models/D001/discovery.py +++ b/core/site_scons/models/D001/discovery.py @@ -13,7 +13,6 @@ def configure( ) -> list[str]: features_available: list[str] = [] board = "D001/boards/stm32f429i-disc1.h" - display = "ltdc.c" hw_model = get_hw_model_as_number("D001") hw_revision = 0 @@ -34,21 +33,13 @@ def configure( defines += [f"HW_MODEL={hw_model}"] defines += [f"HW_REVISION={hw_revision}"] - if "new_rendering" in features_wanted: - sources += [ - "embed/trezorhal/xdisplay_legacy.c", - "embed/trezorhal/stm32f4/xdisplay/stm32f429i-disc1/display_driver.c", - "embed/trezorhal/stm32f4/xdisplay/stm32f429i-disc1/display_ltdc.c", - "embed/trezorhal/stm32f4/xdisplay/stm32f429i-disc1/ili9341_spi.c", - ] - else: - sources += [f"embed/trezorhal/stm32f4/displays/{display}"] - sources += ["embed/trezorhal/stm32f4/displays/ili9341_spi.c"] + sources += [ + "embed/trezorhal/stm32f4/xdisplay/stm32f429i-disc1/display_driver.c", + "embed/trezorhal/stm32f4/xdisplay/stm32f429i-disc1/display_ltdc.c", + "embed/trezorhal/stm32f4/xdisplay/stm32f429i-disc1/ili9341_spi.c", + ] - if "new_rendering" in features_wanted: - sources += ["embed/trezorhal/stm32u5/dma2d_bitblt.c"] - else: - sources += ["embed/trezorhal/stm32u5/dma2d.c"] + sources += ["embed/trezorhal/stm32u5/dma2d_bitblt.c"] sources += [ "vendor/micropython/lib/stm32lib/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c" @@ -58,15 +49,12 @@ def configure( ] defines += ["USE_DMA2D"] defines += ["USE_RGB_COLORS=1"] - defines += ["FRAMEBUFFER"] features_available.append("dma2d") - features_available.append("framebuffer") - if "new_rendering" in features_wanted: - defines += ["XFRAMEBUFFER"] - defines += ["DISPLAY_RGB565"] - features_available.append("xframebuffer") - features_available.append("display_rgb565") + defines += ["XFRAMEBUFFER"] + defines += ["DISPLAY_RGB565"] + features_available.append("xframebuffer") + features_available.append("display_rgb565") sources += ["embed/trezorhal/stm32f4/sdram.c"] defines += ["USE_SDRAM=1"] diff --git a/core/site_scons/models/D002/discovery2.py b/core/site_scons/models/D002/discovery2.py index bba1a17449..5c32e1225a 100644 --- a/core/site_scons/models/D002/discovery2.py +++ b/core/site_scons/models/D002/discovery2.py @@ -13,7 +13,6 @@ def configure( ) -> list[str]: features_available: list[str] = [] board = "D002/boards/stm32u5a9j-dk.h" - display = "dsi.c" hw_model = get_hw_model_as_number("D002") hw_revision = 0 @@ -41,17 +40,11 @@ def configure( f"HW_REVISION={hw_revision}", ] - if "new_rendering" in features_wanted: - sources += [ - "embed/trezorhal/xdisplay_legacy.c", - "embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_driver.c", - "embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_fb.c", - "embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_ltdc_dsi.c", - ] - else: - sources += [ - f"embed/trezorhal/stm32u5/displays/{display}", - ] + sources += [ + "embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_driver.c", + "embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_fb.c", + "embed/trezorhal/stm32u5/xdisplay/stm32u5a9j-dk/display_ltdc_dsi.c", + ] if "input" in features_wanted: sources += ["embed/trezorhal/stm32u5/i2c_bus.c"] @@ -76,25 +69,19 @@ def configure( defines += [ "USE_DMA2D", - "FRAMEBUFFER", - "FRAMEBUFFER32BIT", "UI_COLOR_32BIT", "USE_RGB_COLORS", ] - if "new_rendering" in features_wanted: - sources += ["embed/trezorhal/stm32u5/dma2d_bitblt.c"] - else: - sources += ["embed/trezorhal/stm32u5/dma2d.c"] + + sources += ["embed/trezorhal/stm32u5/dma2d_bitblt.c"] + features_available.append("dma2d") - features_available.append("framebuffer") - features_available.append("framebuffer32bit") features_available.append("ui_color_32bit") - if "new_rendering" in features_wanted: - defines += ["XFRAMEBUFFER"] - defines += ["DISPLAY_RGBA8888"] - features_available.append("xframebuffer") - features_available.append("display_rgba8888") + defines += ["XFRAMEBUFFER"] + defines += ["DISPLAY_RGBA8888"] + features_available.append("xframebuffer") + features_available.append("display_rgba8888") defines += [ "USE_HASH_PROCESSOR=1", diff --git a/core/site_scons/models/T2B1/emulator.py b/core/site_scons/models/T2B1/emulator.py index d2feaa2711..d43df4237c 100644 --- a/core/site_scons/models/T2B1/emulator.py +++ b/core/site_scons/models/T2B1/emulator.py @@ -17,10 +17,9 @@ def configure( hw_revision = 0 mcu = "STM32F427xx" - if "new_rendering" in features_wanted: - defines += ["XFRAMEBUFFER", "DISPLAY_MONO"] - features_available.append("xframebuffer") - features_available.append("display_mono") + defines += ["XFRAMEBUFFER", "DISPLAY_MONO"] + features_available.append("xframebuffer") + features_available.append("display_mono") defines += [mcu] defines += [f'TREZOR_BOARD=\\"{board}\\"'] diff --git a/core/site_scons/models/T2B1/trezor_r_v10.py b/core/site_scons/models/T2B1/trezor_r_v10.py index 398bea69fa..92712e9569 100644 --- a/core/site_scons/models/T2B1/trezor_r_v10.py +++ b/core/site_scons/models/T2B1/trezor_r_v10.py @@ -15,12 +15,10 @@ def configure( hw_model = get_hw_model_as_number("T2B1") hw_revision = 10 board = "T2B1/boards/trezor_r_v10.h" - display = "vg-2864ksweg01.c" - if "new_rendering" in features_wanted: - defines += ["XFRAMEBUFFER"] - features_available.append("xframebuffer") - features_available.append("display_mono") + defines += ["XFRAMEBUFFER"] + features_available.append("xframebuffer") + features_available.append("display_mono") mcu = "STM32F427xx" @@ -39,11 +37,7 @@ def configure( defines += [f"HW_MODEL={hw_model}"] defines += [f"HW_REVISION={hw_revision}"] - if "new_rendering" in features_wanted: - sources += ["embed/trezorhal/xdisplay_legacy.c"] - sources += ["embed/trezorhal/stm32f4/xdisplay/vg-2864/display_driver.c"] - else: - sources += [f"embed/trezorhal/stm32f4/displays/{display}"] + sources += ["embed/trezorhal/stm32f4/xdisplay/vg-2864/display_driver.c"] if "input" in features_wanted: sources += ["embed/trezorhal/stm32f4/button.c"] diff --git a/core/site_scons/models/T2T1/emulator.py b/core/site_scons/models/T2T1/emulator.py index 9b67ea2f5e..cb64af6228 100644 --- a/core/site_scons/models/T2T1/emulator.py +++ b/core/site_scons/models/T2T1/emulator.py @@ -17,9 +17,8 @@ def configure( hw_revision = 0 mcu = "STM32F427xx" - if "new_rendering" in features_wanted: - defines += ["DISPLAY_RGB565"] - features_available.append("display_rgb565") + defines += ["DISPLAY_RGB565"] + features_available.append("display_rgb565") defines += ["USE_RGB_COLORS"] defines += [mcu] @@ -32,12 +31,9 @@ def configure( if "dma2d" in features_wanted: features_available.append("dma2d") - if "new_rendering" in features_wanted: - sources += [ - "embed/trezorhal/unix/dma2d_bitblt.c", - ] - else: - sources += ["embed/lib/dma2d_emul.c"] + sources += [ + "embed/trezorhal/unix/dma2d_bitblt.c", + ] defines += ["USE_DMA2D"] if "sd_card" in features_wanted: diff --git a/core/site_scons/models/T2T1/trezor_t.py b/core/site_scons/models/T2T1/trezor_t.py index f187ff1799..926edad4ca 100644 --- a/core/site_scons/models/T2T1/trezor_t.py +++ b/core/site_scons/models/T2T1/trezor_t.py @@ -13,14 +13,11 @@ def configure( ) -> list[str]: features_available: list[str] = [] board = "T2T1/boards/trezor_t.h" - display = "st7789v.c" hw_model = get_hw_model_as_number("T2T1") hw_revision = 0 - features_available.append("disp_i8080_8bit_dw") - if "new_rendering" in features_wanted: - defines += ["DISPLAY_RGB565"] - features_available.append("display_rgb565") + defines += ["DISPLAY_RGB565"] + features_available.append("display_rgb565") defines += ["USE_RGB_COLORS=1"] mcu = "STM32F427xx" @@ -40,39 +37,14 @@ def configure( defines += [f"HW_MODEL={hw_model}"] defines += [f"HW_REVISION={hw_revision}"] - if "new_rendering" in features_wanted: - 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/tf15411a.c", - ] - sources += [ - "embed/trezorhal/stm32f4/xdisplay/st-7789/panels/154a.c", - ] - sources += [ - "embed/trezorhal/stm32f4/xdisplay/st-7789/panels/lx154a2411.c", - ] - sources += [ - "embed/trezorhal/stm32f4/xdisplay/st-7789/panels/lx154a2422.c", - ] - - else: - sources += [f"embed/trezorhal/stm32f4/displays/{display}"] - sources += [ - "embed/trezorhal/stm32f4/displays/panels/tf15411a.c", - ] - sources += [ - "embed/trezorhal/stm32f4/displays/panels/154a.c", - ] - sources += [ - "embed/trezorhal/stm32f4/displays/panels/lx154a2411.c", - ] - sources += [ - "embed/trezorhal/stm32f4/displays/panels/lx154a2422.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/tf15411a.c"] + sources += ["embed/trezorhal/stm32f4/xdisplay/st-7789/panels/154a.c"] + sources += ["embed/trezorhal/stm32f4/xdisplay/st-7789/panels/lx154a2411.c"] + sources += ["embed/trezorhal/stm32f4/xdisplay/st-7789/panels/lx154a2422.c"] sources += ["embed/trezorhal/stm32f4/backlight_pwm.c"] @@ -117,10 +89,7 @@ def configure( if "dma2d" in features_wanted: defines += ["USE_DMA2D"] - if "new_rendering" in features_wanted: - sources += ["embed/trezorhal/stm32u5/dma2d_bitblt.c"] - else: - sources += ["embed/trezorhal/stm32u5/dma2d.c"] + sources += ["embed/trezorhal/stm32u5/dma2d_bitblt.c"] sources += [ "vendor/micropython/lib/stm32lib/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c" ] diff --git a/core/site_scons/models/T3B1/emulator.py b/core/site_scons/models/T3B1/emulator.py index 9fa9c4fe5d..e06dcaff11 100644 --- a/core/site_scons/models/T3B1/emulator.py +++ b/core/site_scons/models/T3B1/emulator.py @@ -17,10 +17,9 @@ def configure( hw_revision = 0 mcu = "STM32U585xx" - if "new_rendering" in features_wanted: - defines += ["XFRAMEBUFFER", "DISPLAY_MONO"] - features_available.append("xframebuffer") - features_available.append("display_mono") + defines += ["XFRAMEBUFFER", "DISPLAY_MONO"] + features_available.append("xframebuffer") + features_available.append("display_mono") defines += [mcu] defines += [f'TREZOR_BOARD=\\"{board}\\"'] diff --git a/core/site_scons/models/T3B1/trezor_t3b1_revB.py b/core/site_scons/models/T3B1/trezor_t3b1_revB.py index 9ec01792ce..587854928b 100644 --- a/core/site_scons/models/T3B1/trezor_t3b1_revB.py +++ b/core/site_scons/models/T3B1/trezor_t3b1_revB.py @@ -13,14 +13,12 @@ def configure( ) -> list[str]: features_available: list[str] = [] board = "T3B1/boards/trezor_t3b1_revB.h" - display = "vg-2864ksweg01.c" hw_model = get_hw_model_as_number("T3B1") hw_revision = "B" - if "new_rendering" in features_wanted: - defines += ["XFRAMEBUFFER"] - features_available.append("xframebuffer") - features_available.append("display_mono") + defines += ["XFRAMEBUFFER"] + features_available.append("xframebuffer") + features_available.append("display_mono") mcu = "STM32U585xx" linker_script = """embed/trezorhal/stm32u5/linker/u58/{target}.ld""" @@ -40,11 +38,7 @@ def configure( defines += [f"HW_MODEL={hw_model}"] defines += [f"HW_REVISION={ord(hw_revision)}"] - if "new_rendering" in features_wanted: - sources += ["embed/trezorhal/xdisplay_legacy.c"] - sources += ["embed/trezorhal/stm32u5/xdisplay/vg-2864/display_driver.c"] - else: - sources += [f"embed/trezorhal/stm32u5/displays/{display}"] + sources += ["embed/trezorhal/stm32u5/xdisplay/vg-2864/display_driver.c"] if "input" in features_wanted: sources += ["embed/trezorhal/stm32u5/button.c"] diff --git a/core/site_scons/models/T3T1/emulator.py b/core/site_scons/models/T3T1/emulator.py index 38a2a1277e..2f9d5c80b7 100644 --- a/core/site_scons/models/T3T1/emulator.py +++ b/core/site_scons/models/T3T1/emulator.py @@ -17,10 +17,9 @@ def configure( hw_revision = 0 mcu = "STM32U585xx" - if "new_rendering" in features_wanted: - defines += ["XFRAMEBUFFER", "DISPLAY_RGB565"] - features_available.append("xframebuffer") - features_available.append("display_rgb565") + defines += ["XFRAMEBUFFER", "DISPLAY_RGB565"] + features_available.append("xframebuffer") + features_available.append("display_rgb565") defines += ["USE_RGB_COLORS=1"] defines += [mcu] @@ -34,12 +33,9 @@ def configure( if "dma2d" in features_wanted: features_available.append("dma2d") - if "new_rendering" in features_wanted: - sources += [ - "embed/trezorhal/unix/dma2d_bitblt.c", - ] - else: - sources += ["embed/lib/dma2d_emul.c"] + sources += [ + "embed/trezorhal/unix/dma2d_bitblt.c", + ] defines += ["USE_DMA2D"] if "sd_card" in features_wanted: diff --git a/core/site_scons/models/T3T1/trezor_t3t1_revE.py b/core/site_scons/models/T3T1/trezor_t3t1_revE.py index 238be0def2..3adbc000ad 100644 --- a/core/site_scons/models/T3T1/trezor_t3t1_revE.py +++ b/core/site_scons/models/T3T1/trezor_t3t1_revE.py @@ -13,18 +13,13 @@ def configure( ) -> list[str]: features_available: list[str] = [] board = "T3T1/boards/trezor_t3t1_revE.h" - display = "st7789v.c" hw_model = get_hw_model_as_number("T3T1") hw_revision = 0 - features_available.append("disp_i8080_8bit_dw") - features_available.append("framebuffer") - defines += ["FRAMEBUFFER"] - if "new_rendering" in features_wanted: - features_available.append("xframebuffer") - features_available.append("display_rgb565") - defines += ["DISPLAY_RGB565"] - defines += ["XFRAMEBUFFER"] + features_available.append("xframebuffer") + features_available.append("display_rgb565") + defines += ["DISPLAY_RGB565"] + defines += ["XFRAMEBUFFER"] defines += ["USE_RGB_COLORS=1"] mcu = "STM32U585xx" @@ -45,20 +40,13 @@ def configure( defines += [f"HW_MODEL={hw_model}"] defines += [f"HW_REVISION={hw_revision}"] - if "new_rendering" in features_wanted: - sources += ["embed/trezorhal/xdisplay_legacy.c"] - sources += ["embed/trezorhal/stm32u5/xdisplay/st-7789/display_fb.c"] - sources += ["embed/trezorhal/stm32u5/xdisplay/st-7789/display_driver.c"] - sources += ["embed/trezorhal/stm32u5/xdisplay/st-7789/display_io.c"] - sources += ["embed/trezorhal/stm32u5/xdisplay/st-7789/display_panel.c"] - sources += [ - "embed/trezorhal/stm32u5/xdisplay/st-7789/panels/lx154a2482.c", - ] - else: - sources += [f"embed/trezorhal/stm32u5/displays/{display}"] - sources += [ - "embed/trezorhal/stm32u5/displays/panels/lx154a2482.c", - ] + sources += ["embed/trezorhal/stm32u5/xdisplay/st-7789/display_fb.c"] + sources += ["embed/trezorhal/stm32u5/xdisplay/st-7789/display_driver.c"] + sources += ["embed/trezorhal/stm32u5/xdisplay/st-7789/display_io.c"] + sources += ["embed/trezorhal/stm32u5/xdisplay/st-7789/display_panel.c"] + sources += [ + "embed/trezorhal/stm32u5/xdisplay/st-7789/panels/lx154a2482.c", + ] sources += ["embed/trezorhal/stm32u5/backlight_pwm.c"] features_available.append("backlight") @@ -117,10 +105,7 @@ def configure( if "dma2d" in features_wanted: defines += ["USE_DMA2D"] - if "new_rendering" in features_wanted: - sources += ["embed/trezorhal/stm32u5/dma2d_bitblt.c"] - else: - sources += ["embed/trezorhal/stm32u5/dma2d.c"] + sources += ["embed/trezorhal/stm32u5/dma2d_bitblt.c"] features_available.append("dma2d") if "optiga" in features_wanted: diff --git a/core/site_scons/models/T3W1/emulator.py b/core/site_scons/models/T3W1/emulator.py index e6ec19fff4..af00097fd1 100644 --- a/core/site_scons/models/T3W1/emulator.py +++ b/core/site_scons/models/T3W1/emulator.py @@ -34,12 +34,9 @@ def configure( if "dma2d" in features_wanted: features_available.append("dma2d") - if "new_rendering" in features_wanted: - sources += [ - "embed/trezorhal/unix/dma2d_bitblt.c", - ] - else: - sources += ["embed/lib/dma2d_emul.c"] + sources += [ + "embed/trezorhal/unix/dma2d_bitblt.c", + ] defines += ["USE_DMA2D"] if "sbu" in features_wanted: diff --git a/core/site_scons/models/T3W1/trezor_t3w1_d1.py b/core/site_scons/models/T3W1/trezor_t3w1_d1.py index ff765f6db4..7974d62fab 100644 --- a/core/site_scons/models/T3W1/trezor_t3w1_d1.py +++ b/core/site_scons/models/T3W1/trezor_t3w1_d1.py @@ -15,7 +15,6 @@ def configure( 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") @@ -38,7 +37,6 @@ def configure( 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"]