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