1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-05-06 17:09:11 +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/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef TREZORHAL_XDISPLAY_H #pragma once
#define TREZORHAL_XDISPLAY_H
#include <trezor_types.h> #include <trezor_types.h>
@ -109,9 +108,10 @@ int display_get_orientation(void);
typedef struct { typedef struct {
// Pointer to the top-left pixel // Pointer to the top-left pixel
void *ptr; void *ptr;
// Framebuffer size in bytes
size_t size;
// Stride in bytes // Stride in bytes
size_t stride; size_t stride;
} display_fb_info_t; } display_fb_info_t;
// Provides pointer to the inactive (writeable) framebuffer. // 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); const char *display_save(const char *prefix);
void display_clear_save(void); void display_clear_save(void);
#endif #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; display_driver_t *drv = &g_display_driver;
memset(fb, 0, sizeof(display_fb_info_t));
if (!drv->initialized) { if (!drv->initialized) {
return false; 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); int16_t fb_idx = fb_queue_peek(&drv->empty_frames);
if (fb_idx < 0) { if (fb_idx < 0) {
fb_dest->ptr = NULL;
fb_dest->stride = 0;
return false; 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; mpu_set_active_fb(fb->addr, fb->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));
return true; return true;
} }

View File

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

View File

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

View File

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

View File

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

View File

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