mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-18 04:18:10 +00:00
feat(core): support 16bit i8080 display bus
[no changelog]
This commit is contained in:
parent
f403b4c511
commit
0c5db05357
@ -21,6 +21,8 @@ button = []
|
|||||||
touch = []
|
touch = []
|
||||||
clippy = []
|
clippy = []
|
||||||
jpeg = []
|
jpeg = []
|
||||||
|
disp_i8080_8bit_dw = [] # write pixels directly to peripheral
|
||||||
|
disp_i8080_16bit_dw = [] # write pixels directly to peripheral
|
||||||
debug = ["ui_debug"]
|
debug = ["ui_debug"]
|
||||||
sbu = []
|
sbu = []
|
||||||
sd_card = []
|
sd_card = []
|
||||||
|
@ -104,7 +104,15 @@ pub fn bar_radius_buffer(x: i16, y: i16, w: i16, h: i16, radius: u8, buffer: &mu
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
#[cfg(all(feature = "model_tt", target_arch = "arm"))]
|
#[cfg(all(feature = "disp_i8080_16bit_dw", not(feature = "disp_i8080_8bit_dw")))]
|
||||||
|
pub fn pixeldata(c: u16) {
|
||||||
|
unsafe {
|
||||||
|
ffi::DISPLAY_DATA_ADDRESS.write_volatile(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
#[cfg(feature = "disp_i8080_8bit_dw")]
|
||||||
pub fn pixeldata(c: u16) {
|
pub fn pixeldata(c: u16) {
|
||||||
unsafe {
|
unsafe {
|
||||||
ffi::DISPLAY_DATA_ADDRESS.write_volatile((c & 0xff) as u8);
|
ffi::DISPLAY_DATA_ADDRESS.write_volatile((c & 0xff) as u8);
|
||||||
@ -113,7 +121,7 @@ pub fn pixeldata(c: u16) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
#[cfg(not(all(feature = "model_tt", target_arch = "arm")))]
|
#[cfg(not(any(feature = "disp_i8080_16bit_dw", feature = "disp_i8080_8bit_dw")))]
|
||||||
pub fn pixeldata(c: u16) {
|
pub fn pixeldata(c: u16) {
|
||||||
unsafe {
|
unsafe {
|
||||||
ffi::display_pixeldata(c);
|
ffi::display_pixeldata(c);
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#define USE_I2C 1
|
#define USE_I2C 1
|
||||||
#define USE_TOUCH 1
|
#define USE_TOUCH 1
|
||||||
#define USE_SBU 1
|
#define USE_SBU 1
|
||||||
|
#define USE_DISP_I8080_8BIT_DW 1
|
||||||
|
|
||||||
#include "displays/st7789v.h"
|
#include "displays/st7789v.h"
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include TREZOR_BOARD
|
#include TREZOR_BOARD
|
||||||
#include "display_interface.h"
|
#include "display_interface.h"
|
||||||
#include "memzero.h"
|
#include "memzero.h"
|
||||||
|
#include "st7789v.h"
|
||||||
#include STM32_HAL_H
|
#include STM32_HAL_H
|
||||||
|
|
||||||
// using const volatile instead of #define results in binaries that change
|
// using const volatile instead of #define results in binaries that change
|
||||||
@ -32,13 +33,17 @@ const volatile uint8_t DISPLAY_ST7789V_INVERT_COLORS = 0;
|
|||||||
// FSMC/FMC Bank 1 - NOR/PSRAM 1
|
// FSMC/FMC Bank 1 - NOR/PSRAM 1
|
||||||
#define DISPLAY_MEMORY_BASE 0x60000000
|
#define DISPLAY_MEMORY_BASE 0x60000000
|
||||||
#define DISPLAY_MEMORY_PIN 16
|
#define DISPLAY_MEMORY_PIN 16
|
||||||
|
#ifdef USE_DISP_I8080_16BIT_DW
|
||||||
|
#define DISPLAY_ADDR_SHIFT 2
|
||||||
|
#elif USE_DISP_I8080_8BIT_DW
|
||||||
|
#define DISPLAY_ADDR_SHIFT 1
|
||||||
|
#endif
|
||||||
|
|
||||||
__IO uint8_t *const DISPLAY_CMD_ADDRESS =
|
__IO DISP_MEM_TYPE *const DISPLAY_CMD_ADDRESS =
|
||||||
(__IO uint8_t *const)((uint32_t)DISPLAY_MEMORY_BASE);
|
(__IO DISP_MEM_TYPE *const)((uint32_t)DISPLAY_MEMORY_BASE);
|
||||||
__IO uint8_t *const DISPLAY_DATA_ADDRESS =
|
__IO DISP_MEM_TYPE *const DISPLAY_DATA_ADDRESS =
|
||||||
(__IO uint8_t *const)((uint32_t)DISPLAY_MEMORY_BASE |
|
(__IO DISP_MEM_TYPE *const)((uint32_t)DISPLAY_MEMORY_BASE |
|
||||||
(1 << DISPLAY_MEMORY_PIN));
|
(DISPLAY_ADDR_SHIFT << DISPLAY_MEMORY_PIN));
|
||||||
|
|
||||||
#define LED_PWM_TIM_PERIOD \
|
#define LED_PWM_TIM_PERIOD \
|
||||||
(255) // little less than 4kHz with PSC = (SystemCoreClock / 1000000) - 1)
|
(255) // little less than 4kHz with PSC = (SystemCoreClock / 1000000) - 1)
|
||||||
#define LED_PWM_SLOW_TIM_PERIOD \
|
#define LED_PWM_SLOW_TIM_PERIOD \
|
||||||
@ -526,7 +531,12 @@ void display_setup_fmc(void) {
|
|||||||
external_display_data_sram.Init.NSBank = FMC_NORSRAM_BANK1;
|
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.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
|
||||||
external_display_data_sram.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
|
external_display_data_sram.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
|
||||||
|
#ifdef USE_DISP_I8080_16BIT_DW
|
||||||
|
external_display_data_sram.Init.MemoryDataWidth =
|
||||||
|
FMC_NORSRAM_MEM_BUS_WIDTH_16;
|
||||||
|
#elif USE_DISP_I8080_8BIT_DW
|
||||||
external_display_data_sram.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_8;
|
external_display_data_sram.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_8;
|
||||||
|
#endif
|
||||||
external_display_data_sram.Init.BurstAccessMode =
|
external_display_data_sram.Init.BurstAccessMode =
|
||||||
FMC_BURST_ACCESS_MODE_DISABLE;
|
FMC_BURST_ACCESS_MODE_DISABLE;
|
||||||
external_display_data_sram.Init.WaitSignalPolarity =
|
external_display_data_sram.Init.WaitSignalPolarity =
|
||||||
@ -559,6 +569,9 @@ void display_setup_fmc(void) {
|
|||||||
void display_init(void) {
|
void display_init(void) {
|
||||||
// init peripherals
|
// init peripherals
|
||||||
__HAL_RCC_GPIOE_CLK_ENABLE();
|
__HAL_RCC_GPIOE_CLK_ENABLE();
|
||||||
|
__HAL_RCC_GPIOA_CLK_ENABLE();
|
||||||
|
__HAL_RCC_GPIOC_CLK_ENABLE();
|
||||||
|
__HAL_RCC_GPIOD_CLK_ENABLE();
|
||||||
__HAL_RCC_TIM1_CLK_ENABLE();
|
__HAL_RCC_TIM1_CLK_ENABLE();
|
||||||
__HAL_RCC_FMC_CLK_ENABLE();
|
__HAL_RCC_FMC_CLK_ENABLE();
|
||||||
|
|
||||||
@ -631,6 +644,18 @@ void display_init(void) {
|
|||||||
// LCD_D4/PE7 LCD_D5/PE8 LCD_D6/PE9 LCD_D7/PE10
|
// 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;
|
GPIO_InitStructure.Pin = GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10;
|
||||||
HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
|
HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
|
||||||
|
#ifdef USE_DISP_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_setup_fmc();
|
||||||
|
|
||||||
|
@ -10,14 +10,27 @@
|
|||||||
#define DISPLAY_RESY 240
|
#define DISPLAY_RESY 240
|
||||||
#define TREZOR_FONT_BPP 4
|
#define TREZOR_FONT_BPP 4
|
||||||
|
|
||||||
extern __IO uint8_t *const DISPLAY_CMD_ADDRESS;
|
#ifdef USE_DISP_I8080_16BIT_DW
|
||||||
extern __IO uint8_t *const DISPLAY_DATA_ADDRESS;
|
#define DISP_MEM_TYPE uint16_t
|
||||||
|
#elif USE_DISP_I8080_8BIT_DW
|
||||||
|
#define DISP_MEM_TYPE uint8_t
|
||||||
|
#else
|
||||||
|
#error "Unsupported display interface"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
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 CMD(X) (*DISPLAY_CMD_ADDRESS = (X))
|
||||||
#define DATA(X) (*DISPLAY_DATA_ADDRESS = (X))
|
#define DATA(X) (*DISPLAY_DATA_ADDRESS = (X))
|
||||||
|
|
||||||
|
#ifdef USE_DISP_I8080_16BIT_DW
|
||||||
|
#define PIXELDATA(X) DATA(X)
|
||||||
|
#elif USE_DISP_I8080_8BIT_DW
|
||||||
#define PIXELDATA(X) \
|
#define PIXELDATA(X) \
|
||||||
DATA((X)&0xFF); \
|
DATA((X)&0xFF); \
|
||||||
DATA((X) >> 8)
|
DATA((X) >> 8)
|
||||||
|
#endif
|
||||||
|
|
||||||
void display_set_little_endian(void);
|
void display_set_little_endian(void);
|
||||||
void display_set_big_endian(void);
|
void display_set_big_endian(void);
|
||||||
|
@ -7,6 +7,7 @@ def configure(env, features_wanted, defines, sources):
|
|||||||
display = 'st7789v.c'
|
display = 'st7789v.c'
|
||||||
hw_model = get_hw_model_as_number('T2T1')
|
hw_model = get_hw_model_as_number('T2T1')
|
||||||
hw_revision = 0
|
hw_revision = 0
|
||||||
|
features_available.append("disp_i8080_8bit_dw")
|
||||||
|
|
||||||
defines += [f'TREZOR_BOARD=\\"boards/{board}\\"', ]
|
defines += [f'TREZOR_BOARD=\\"boards/{board}\\"', ]
|
||||||
defines += [f'HW_MODEL={hw_model}', ]
|
defines += [f'HW_MODEL={hw_model}', ]
|
||||||
|
Loading…
Reference in New Issue
Block a user