1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-03-06 10:16:07 +00:00

refactor(core): improve frame buffer interface

[no changelog]
This commit is contained in:
cepetr 2025-03-03 16:33:10 +01:00 committed by cepetr
parent 8b525de3c9
commit 2961f6caf9
7 changed files with 27 additions and 37 deletions

View File

@ -17,8 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TREZORHAL_XDISPLAY_H
#define TREZORHAL_XDISPLAY_H
#pragma once
#include <trezor_types.h>
@ -109,9 +108,10 @@ int display_get_orientation(void);
typedef struct {
// Pointer to the top-left pixel
void *ptr;
// Framebuffer size in bytes
size_t size;
// Stride in bytes
size_t stride;
} display_fb_info_t;
// Provides pointer to the inactive (writeable) framebuffer.
@ -163,5 +163,3 @@ void display_copy_mono1p(const gfx_bitblt_t *bb);
const char *display_save(const char *prefix);
void display_clear_save(void);
#endif
#endif // TREZORHAL_XDISPLAY_H

View File

@ -99,9 +99,11 @@ static uint8_t *get_fb_ptr(int16_t index) {
}
}
bool display_get_frame_buffer(display_fb_info_t *fb_dest) {
bool display_get_frame_buffer(display_fb_info_t *fb) {
display_driver_t *drv = &g_display_driver;
memset(fb, 0, sizeof(display_fb_info_t));
if (!drv->initialized) {
return false;
}
@ -116,25 +118,14 @@ bool display_get_frame_buffer(display_fb_info_t *fb_dest) {
int16_t fb_idx = fb_queue_peek(&drv->empty_frames);
if (fb_idx < 0) {
fb_dest->ptr = NULL;
fb_dest->stride = 0;
return false;
}
uintptr_t addr = (uintptr_t)get_fb_ptr(fb_idx);
fb->addr = get_fb_ptr(fb_idx);
fb->stride = FRAME_BUFFER_PIXELS_PER_LINE * FB_PIXEL_SIZE;
fb->size = fb->stride * DISPLAY_RESY;
uint32_t fb_stride = FRAME_BUFFER_PIXELS_PER_LINE * FB_PIXEL_SIZE;
display_fb_info_t fb = {
.ptr = (void *)addr,
.stride = fb_stride,
};
size_t fb_size = fb_stride * DISPLAY_RESY;
mpu_set_active_fb((void *)addr, fb_size);
memcpy(fb_dest, &fb, sizeof(display_fb_info_t));
mpu_set_active_fb(fb->addr, fb->size);
return true;
}

View File

@ -174,9 +174,9 @@ void DISPLAY_TE_INTERRUPT_HANDLER(void) {
bool display_get_frame_buffer(display_fb_info_t *fb) {
display_driver_t *drv = &g_display_driver;
memset(fb, 0, sizeof(display_fb_info_t));
if (!drv->initialized) {
fb->ptr = NULL;
fb->stride = 0;
return false;
}
@ -185,8 +185,9 @@ bool display_get_frame_buffer(display_fb_info_t *fb) {
fb->ptr = get_fb_ptr(fb_idx);
fb->stride = DISPLAY_RESX * sizeof(uint16_t);
fb->size = PHYSICAL_FRAME_BUFFER_SIZE;
// Enable access to the frame buffer from the unprivileged code
mpu_set_active_fb(fb->ptr, PHYSICAL_FRAME_BUFFER_SIZE);
mpu_set_active_fb(fb->ptr, fb->size);
return true;
}

View File

@ -133,12 +133,13 @@ int display_get_orientation(void) {
bool display_get_frame_buffer(display_fb_info_t *fb) {
display_driver_t *drv = &g_display_driver;
memset(fb, 0, sizeof(display_fb_info_t));
if (!drv->initialized) {
fb->ptr = NULL;
fb->stride = 0;
return false;
} else {
fb->ptr = (void *)drv->framebuf;
fb->size = FRAME_BUFFER_SIZE;
fb->stride = DISPLAY_RESX * sizeof(uint16_t);
// Enable access to the frame buffer from the unprivileged code
mpu_set_active_fb(fb->ptr, FRAME_BUFFER_SIZE);

View File

@ -278,18 +278,20 @@ int display_get_orientation(void) {
bool display_get_frame_buffer(display_fb_info_t *fb) {
display_driver_t *drv = &g_display_driver;
memset(fb, 0, sizeof(display_fb_info_t));
if (!drv->initialized) {
fb->ptr = NULL;
fb->stride = 0;
return false;
}
#ifdef DISPLAY_MONO
fb->ptr = drv->mono_framebuf;
fb->stride = DISPLAY_RESX;
fb->size = DISPLAY_RESX * DISPLAY_RESY;
#else
fb->ptr = drv->buffer->pixels;
fb->stride = DISPLAY_RESX * PIXEL_SIZE;
fb->size = DISPLAY_RESX * DISPLAY_RESY * PIXEL_SIZE;
#endif
return true;
}

View File

@ -391,15 +391,16 @@ int display_get_orientation(void) {
bool display_get_frame_buffer(display_fb_info_t *fb) {
display_driver_t *drv = &g_display_driver;
memset(fb, 0, sizeof(display_fb_info_t));
if (!drv->initialized) {
fb->ptr = NULL;
fb->stride = 0;
return false;
} else {
fb->ptr = &drv->framebuf[0];
fb->size = FRAME_BUFFER_SIZE;
fb->stride = DISPLAY_RESX;
// Enable access to the frame buffer from the unprivileged code
mpu_set_active_fb(fb->ptr, FRAME_BUFFER_SIZE);
mpu_set_active_fb(fb->ptr, fb->size);
return true;
}
}

View File

@ -31,6 +31,7 @@ pub fn refresh() {
pub fn get_frame_buffer() -> Option<(&'static mut [u8], usize)> {
let mut fb_info = ffi::display_fb_info_t {
ptr: ptr::null_mut(),
size: 0,
stride: 0,
};
@ -40,12 +41,7 @@ pub fn get_frame_buffer() -> Option<(&'static mut [u8], usize)> {
return None;
}
let fb = unsafe {
core::slice::from_raw_parts_mut(
fb_info.ptr as *mut u8,
DISPLAY_RESY as usize * fb_info.stride,
)
};
let fb = unsafe { core::slice::from_raw_parts_mut(fb_info.ptr as *mut u8, fb_info.size) };
Some((fb, fb_info.stride))
}