1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-17 21:22:10 +00:00

feat(core/rust): expose raw pixel access to rust

This commit is contained in:
tychovrahe 2022-06-01 11:49:57 +02:00 committed by matejcik
parent 7b7318c3aa
commit 61482d0795
8 changed files with 53 additions and 11 deletions

View File

@ -0,0 +1 @@
Expose raw pixel access to Rust

View File

@ -68,7 +68,7 @@ static struct {
static bool pixeldata_dirty = true;
void PIXELDATA(uint16_t c) {
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
@ -89,12 +89,13 @@ void PIXELDATA(uint16_t c) {
}
}
#define PIXELDATA(c) display_pixeldata(c)
static void display_reset_state() {}
void PIXELDATA_DIRTY() { pixeldata_dirty = true; }
static void display_set_window(uint16_t x0, uint16_t y0, uint16_t x1,
uint16_t y1) {
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;

View File

@ -57,7 +57,7 @@ static void display_set_page_and_col(uint8_t page, uint8_t col) {
}
}
void PIXELDATA(uint16_t c) {
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);
@ -93,6 +93,8 @@ void PIXELDATA(uint16_t c) {
}
}
#define PIXELDATA(c) display_pixeldata(c)
static void display_reset_state(void) {
memset(DISPLAY_STATE.RAM, 0, sizeof(DISPLAY_STATE.RAM));
DISPLAY_STATE.row = 0;
@ -115,8 +117,7 @@ static void display_unsleep(void) {
CMD(0xAF); // Display ON
}
static void display_set_window(uint16_t x0, uint16_t y0, uint16_t x1,
uint16_t y1) {
void display_set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
if (x1 >= DISPLAY_RESX) {
x1 = DISPLAY_RESX - 1;
}

View File

@ -56,6 +56,8 @@ const volatile uint8_t DISPLAY_ST7789V_INVERT_COLORS = 0;
// of ILI9341V datasheet
#define DISPLAY_ID_ILI9341V 0x009341U
void display_pixeldata(uint16_t c) { PIXELDATA(c); }
static uint32_t read_display_id(uint8_t command) {
volatile uint8_t c = 0;
uint32_t id = 0;
@ -117,8 +119,7 @@ static void display_unsleep(void) {
static struct { uint16_t x, y; } BUFFER_OFFSET;
static void display_set_window(uint16_t x0, uint16_t y0, uint16_t x1,
uint16_t y1) {
void display_set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
x0 += BUFFER_OFFSET.x;
x1 += BUFFER_OFFSET.x;
y0 += BUFFER_OFFSET.y;

View File

@ -75,7 +75,7 @@ static struct {
// noop on unix, display is refreshed every loop step
#define PIXELDATA_DIRTY()
void PIXELDATA(uint16_t c) {
void display_pixeldata(uint16_t c) {
#if defined TREZOR_MODEL_1 || defined TREZOR_MODEL_R
// set to white if highest bits of all R, G, B values are set to 1
// bin(10000 100000 10000) = hex(0x8410)
@ -98,6 +98,8 @@ void PIXELDATA(uint16_t c) {
}
}
#define PIXELDATA(c) display_pixeldata(c)
static void display_reset_state() {}
void display_init_seq(void) {}
@ -208,8 +210,7 @@ void display_init(void) {
#endif
}
static void display_set_window(uint16_t x0, uint16_t y0, uint16_t x1,
uint16_t y1) {
void display_set_window(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
if (!RENDERER) {
display_init();
}

View File

@ -989,3 +989,5 @@ void display_utf8_substr(const char *buf_start, size_t buf_len, int char_off,
*out_start = buf_start + i_start;
*out_len = i - i_start;
}
void display_pixeldata_dirty(void) { PIXELDATA_DIRTY(); }

View File

@ -107,3 +107,21 @@ pub fn loader(
);
}
}
pub fn pixeldata(c: u16) {
unsafe {
ffi::display_pixeldata(c);
}
}
pub fn pixeldata_dirty() {
unsafe {
ffi::display_pixeldata_dirty();
}
}
pub fn set_window(x0: u16, y0: u16, x1: u16, y1: u16) {
unsafe {
ffi::display_set_window(x0, y0, x1, y1);
}
}

View File

@ -183,6 +183,23 @@ pub fn text_right(baseline: Point, text: &str, font: Font, fg_color: Color, bg_c
);
}
pub fn pixeldata(color: Color) {
display::pixeldata(color.into());
}
pub fn pixeldata_dirty() {
display::pixeldata_dirty();
}
pub fn set_window(window: Rect) {
display::set_window(
window.x0 as u16,
window.y0 as u16,
window.x1 as u16 - 1,
window.y1 as u16 - 1,
);
}
#[derive(Copy, Clone, PartialEq, Eq)]
pub struct Font(i32);