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:
parent
8b525de3c9
commit
2961f6caf9
@ -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
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user