mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-01-03 12:00:59 +00:00
refactor(core): adjust display api for syscall verifier
[no changelog]
This commit is contained in:
parent
305f16c86b
commit
0312158aa1
@ -185,7 +185,12 @@ pub fn clear() {
|
|||||||
|
|
||||||
#[cfg(feature = "xframebuffer")]
|
#[cfg(feature = "xframebuffer")]
|
||||||
pub fn get_frame_buffer() -> (&'static mut [u8], usize) {
|
pub fn get_frame_buffer() -> (&'static mut [u8], usize) {
|
||||||
let fb_info = unsafe { ffi::display_get_frame_buffer() };
|
let mut fb_info = ffi::display_fb_info_t {
|
||||||
|
ptr: ptr::null_mut(),
|
||||||
|
stride: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
unsafe { ffi::display_get_frame_buffer(&mut fb_info) };
|
||||||
|
|
||||||
let fb = unsafe {
|
let fb = unsafe {
|
||||||
core::slice::from_raw_parts_mut(
|
core::slice::from_raw_parts_mut(
|
||||||
|
@ -177,8 +177,8 @@ __attribute((no_stack_protector)) void syscall_handler(uint32_t *args,
|
|||||||
|
|
||||||
#if XFRAMEBUFFER
|
#if XFRAMEBUFFER
|
||||||
case SYSCALL_DISPLAY_GET_FB_INFO: {
|
case SYSCALL_DISPLAY_GET_FB_INFO: {
|
||||||
display_fb_info_t *info = (display_fb_info_t *)args[0];
|
display_fb_info_t *fb = (display_fb_info_t *)args[0];
|
||||||
*info = display_get_frame_buffer();
|
args[0] = (uint32_t)display_get_frame_buffer(fb);
|
||||||
} break;
|
} break;
|
||||||
#else
|
#else
|
||||||
case SYSCALL_DISPLAY_WAIT_FOR_SYNC: {
|
case SYSCALL_DISPLAY_WAIT_FOR_SYNC: {
|
||||||
|
@ -148,10 +148,8 @@ int display_get_orientation(void) {
|
|||||||
|
|
||||||
#ifdef XFRAMEBUFFER
|
#ifdef XFRAMEBUFFER
|
||||||
|
|
||||||
display_fb_info_t display_get_frame_buffer(void) {
|
bool display_get_frame_buffer(display_fb_info_t *fb) {
|
||||||
display_fb_info_t info;
|
return (bool)syscall_invoke1((uint32_t)fb, SYSCALL_DISPLAY_GET_FB_INFO);
|
||||||
syscall_invoke1((uint32_t)&info, SYSCALL_DISPLAY_GET_FB_INFO);
|
|
||||||
return info;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#else // XFRAMEBUFFER
|
#else // XFRAMEBUFFER
|
||||||
|
@ -144,15 +144,13 @@ void DISPLAY_TE_INTERRUPT_HANDLER(void) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
display_fb_info_t display_get_frame_buffer(void) {
|
bool display_get_frame_buffer(display_fb_info_t *fb) {
|
||||||
display_driver_t *drv = &g_display_driver;
|
display_driver_t *drv = &g_display_driver;
|
||||||
|
|
||||||
if (!drv->initialized) {
|
if (!drv->initialized) {
|
||||||
display_fb_info_t fb = {
|
fb->ptr = NULL;
|
||||||
.ptr = NULL,
|
fb->stride = 0;
|
||||||
.stride = 0,
|
return false;
|
||||||
};
|
|
||||||
return fb;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
frame_buffer_state_t state;
|
frame_buffer_state_t state;
|
||||||
@ -177,12 +175,10 @@ display_fb_info_t display_get_frame_buffer(void) {
|
|||||||
|
|
||||||
drv->queue.entry[drv->queue.wix] = FB_STATE_PREPARING;
|
drv->queue.entry[drv->queue.wix] = FB_STATE_PREPARING;
|
||||||
|
|
||||||
display_fb_info_t fb = {
|
fb->ptr = get_fb_ptr(drv->queue.wix);
|
||||||
.ptr = get_fb_ptr(drv->queue.wix),
|
fb->stride = DISPLAY_RESX * sizeof(uint16_t);
|
||||||
.stride = DISPLAY_RESX * sizeof(uint16_t),
|
|
||||||
};
|
|
||||||
|
|
||||||
return fb;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copies the frame buffer with the given index to the display
|
// Copies the frame buffer with the given index to the display
|
||||||
@ -289,9 +285,9 @@ void display_ensure_refreshed(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void display_fill(const gfx_bitblt_t *bb) {
|
void display_fill(const gfx_bitblt_t *bb) {
|
||||||
display_fb_info_t fb = display_get_frame_buffer();
|
display_fb_info_t fb;
|
||||||
|
|
||||||
if (fb.ptr == NULL) {
|
if (!display_get_frame_buffer(&fb)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -303,9 +299,9 @@ void display_fill(const gfx_bitblt_t *bb) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void display_copy_rgb565(const gfx_bitblt_t *bb) {
|
void display_copy_rgb565(const gfx_bitblt_t *bb) {
|
||||||
display_fb_info_t fb = display_get_frame_buffer();
|
display_fb_info_t fb;
|
||||||
|
|
||||||
if (fb.ptr == NULL) {
|
if (!display_get_frame_buffer(&fb)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -317,9 +313,9 @@ void display_copy_rgb565(const gfx_bitblt_t *bb) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void display_copy_mono1p(const gfx_bitblt_t *bb) {
|
void display_copy_mono1p(const gfx_bitblt_t *bb) {
|
||||||
display_fb_info_t fb = display_get_frame_buffer();
|
display_fb_info_t fb;
|
||||||
|
|
||||||
if (fb.ptr == NULL) {
|
if (!display_get_frame_buffer(&fb)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -331,9 +327,9 @@ void display_copy_mono1p(const gfx_bitblt_t *bb) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void display_copy_mono4(const gfx_bitblt_t *bb) {
|
void display_copy_mono4(const gfx_bitblt_t *bb) {
|
||||||
display_fb_info_t fb = display_get_frame_buffer();
|
display_fb_info_t fb;
|
||||||
|
|
||||||
if (fb.ptr == NULL) {
|
if (!display_get_frame_buffer(&fb)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,21 +123,17 @@ int display_get_orientation(void) {
|
|||||||
return drv->orientation_angle;
|
return drv->orientation_angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
display_fb_info_t display_get_frame_buffer(void) {
|
bool display_get_frame_buffer(display_fb_info_t *fb) {
|
||||||
display_driver_t *drv = &g_display_driver;
|
display_driver_t *drv = &g_display_driver;
|
||||||
|
|
||||||
if (!drv->initialized) {
|
if (!drv->initialized) {
|
||||||
display_fb_info_t fb = {
|
fb->ptr = NULL;
|
||||||
.ptr = NULL,
|
fb->stride = 0;
|
||||||
.stride = 0,
|
return false;
|
||||||
};
|
|
||||||
return fb;
|
|
||||||
} else {
|
} else {
|
||||||
display_fb_info_t fb = {
|
fb->ptr = (void *)drv->framebuf;
|
||||||
.ptr = (void *)drv->framebuf,
|
fb->stride = DISPLAY_RESX * sizeof(uint16_t);
|
||||||
.stride = DISPLAY_RESX * sizeof(uint16_t),
|
return true;
|
||||||
};
|
|
||||||
return fb;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -390,21 +390,17 @@ int display_get_orientation(void) {
|
|||||||
return drv->orientation_angle;
|
return drv->orientation_angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
display_fb_info_t display_get_frame_buffer(void) {
|
bool display_get_frame_buffer(display_fb_info_t *fb) {
|
||||||
display_driver_t *drv = &g_display_driver;
|
display_driver_t *drv = &g_display_driver;
|
||||||
|
|
||||||
if (!drv->initialized) {
|
if (!drv->initialized) {
|
||||||
const static display_fb_info_t fb = {
|
fb->ptr = NULL;
|
||||||
.ptr = NULL,
|
fb->stride = 0;
|
||||||
.stride = 0,
|
return false;
|
||||||
};
|
|
||||||
return fb;
|
|
||||||
} else {
|
} else {
|
||||||
display_fb_info_t fb = {
|
fb->ptr = &drv->framebuf[0];
|
||||||
.ptr = &drv->framebuf[0],
|
fb->stride = DISPLAY_RESX;
|
||||||
.stride = DISPLAY_RESX,
|
return true;
|
||||||
};
|
|
||||||
return fb;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -359,21 +359,17 @@ int display_get_orientation(void) {
|
|||||||
return drv->orientation_angle;
|
return drv->orientation_angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
display_fb_info_t display_get_frame_buffer(void) {
|
bool display_get_frame_buffer(display_fb_info_t *fb) {
|
||||||
display_driver_t *drv = &g_display_driver;
|
display_driver_t *drv = &g_display_driver;
|
||||||
|
|
||||||
if (!drv->initialized) {
|
if (!drv->initialized) {
|
||||||
static const display_fb_info_t fb = {
|
fb->ptr = NULL;
|
||||||
.ptr = NULL,
|
fb->stride = 0;
|
||||||
.stride = 0,
|
return false;
|
||||||
};
|
|
||||||
return fb;
|
|
||||||
} else {
|
} else {
|
||||||
display_fb_info_t fb = {
|
fb->ptr = &drv->framebuf[0];
|
||||||
.ptr = &drv->framebuf[0],
|
fb->stride = DISPLAY_RESX;
|
||||||
.stride = DISPLAY_RESX,
|
return true;
|
||||||
};
|
|
||||||
return fb;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,9 +391,9 @@ void display_refresh(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void display_fill(const gfx_bitblt_t *bb) {
|
void display_fill(const gfx_bitblt_t *bb) {
|
||||||
display_fb_info_t fb = display_get_frame_buffer();
|
display_fb_info_t fb;
|
||||||
|
|
||||||
if (fb.ptr == NULL) {
|
if (!display_get_frame_buffer(&fb)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -409,9 +405,9 @@ void display_fill(const gfx_bitblt_t *bb) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void display_copy_mono1p(const gfx_bitblt_t *bb) {
|
void display_copy_mono1p(const gfx_bitblt_t *bb) {
|
||||||
display_fb_info_t fb = display_get_frame_buffer();
|
display_fb_info_t fb;
|
||||||
|
|
||||||
if (fb.ptr == NULL) {
|
if (!display_get_frame_buffer(&fb)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,9 +161,9 @@ int display_get_orientation(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void display_fill(const gfx_bitblt_t *bb) {
|
void display_fill(const gfx_bitblt_t *bb) {
|
||||||
display_fb_info_t fb = display_get_frame_buffer();
|
display_fb_info_t fb;
|
||||||
|
|
||||||
if (fb.ptr == NULL) {
|
if (!display_get_frame_buffer(&fb)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,9 +175,9 @@ void display_fill(const gfx_bitblt_t *bb) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void display_copy_rgb565(const gfx_bitblt_t *bb) {
|
void display_copy_rgb565(const gfx_bitblt_t *bb) {
|
||||||
display_fb_info_t fb = display_get_frame_buffer();
|
display_fb_info_t fb;
|
||||||
|
|
||||||
if (fb.ptr == NULL) {
|
if (!display_get_frame_buffer(&fb)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,9 +189,9 @@ void display_copy_rgb565(const gfx_bitblt_t *bb) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void display_copy_mono1p(const gfx_bitblt_t *bb) {
|
void display_copy_mono1p(const gfx_bitblt_t *bb) {
|
||||||
display_fb_info_t fb = display_get_frame_buffer();
|
display_fb_info_t fb;
|
||||||
|
|
||||||
if (fb.ptr == NULL) {
|
if (!display_get_frame_buffer(&fb)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -203,9 +203,9 @@ void display_copy_mono1p(const gfx_bitblt_t *bb) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void display_copy_mono4(const gfx_bitblt_t *bb) {
|
void display_copy_mono4(const gfx_bitblt_t *bb) {
|
||||||
display_fb_info_t fb = display_get_frame_buffer();
|
display_fb_info_t fb;
|
||||||
|
|
||||||
if (fb.ptr == NULL) {
|
if (!display_get_frame_buffer(&fb)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,15 +40,13 @@ ALIGN_32BYTES(uint32_t physical_frame_buffer_1[PHYSICAL_FRAME_BUFFER_SIZE]);
|
|||||||
__attribute__((section(".framebuffer_select"))) uint32_t current_frame_buffer =
|
__attribute__((section(".framebuffer_select"))) uint32_t current_frame_buffer =
|
||||||
0;
|
0;
|
||||||
|
|
||||||
display_fb_info_t display_get_frame_buffer(void) {
|
bool display_get_frame_buffer(display_fb_info_t *fb) {
|
||||||
display_driver_t *drv = &g_display_driver;
|
display_driver_t *drv = &g_display_driver;
|
||||||
|
|
||||||
if (!drv->initialized) {
|
if (!drv->initialized) {
|
||||||
display_fb_info_t fb = {
|
fb->ptr = NULL;
|
||||||
.ptr = NULL,
|
fb->stride = 0;
|
||||||
.stride = 0,
|
return false;
|
||||||
};
|
|
||||||
return fb;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uintptr_t addr;
|
uintptr_t addr;
|
||||||
@ -66,12 +64,10 @@ display_fb_info_t display_get_frame_buffer(void) {
|
|||||||
addr += (480 - DISPLAY_RESY) / 2 * sizeof(uint32_t);
|
addr += (480 - DISPLAY_RESY) / 2 * sizeof(uint32_t);
|
||||||
addr += (480 - DISPLAY_RESX) / 2 * fb_stride;
|
addr += (480 - DISPLAY_RESX) / 2 * fb_stride;
|
||||||
|
|
||||||
display_fb_info_t fb = {
|
fb->ptr = (void *)addr;
|
||||||
.ptr = (void *)addr,
|
fb->stride = fb_stride;
|
||||||
.stride = fb_stride,
|
|
||||||
};
|
|
||||||
|
|
||||||
return fb;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void display_refresh(void) {
|
void display_refresh(void) {
|
||||||
|
@ -245,28 +245,22 @@ int display_get_orientation(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef XFRAMEBUFFER
|
#ifdef XFRAMEBUFFER
|
||||||
display_fb_info_t display_get_frame_buffer(void) {
|
bool display_get_frame_buffer(display_fb_info_t *fb) {
|
||||||
display_driver_t *drv = &g_display_driver;
|
display_driver_t *drv = &g_display_driver;
|
||||||
|
|
||||||
if (!drv->initialized) {
|
if (!drv->initialized) {
|
||||||
display_fb_info_t fb = {
|
fb->ptr = NULL;
|
||||||
.ptr = NULL,
|
fb->stride = 0;
|
||||||
.stride = 0,
|
return false;
|
||||||
};
|
|
||||||
return fb;
|
|
||||||
} else {
|
} else {
|
||||||
#ifdef DISPLAY_MONO
|
#ifdef DISPLAY_MONO
|
||||||
display_fb_info_t fb = {
|
fb->ptr = drv->mono_framebuf;
|
||||||
.ptr = drv->mono_framebuf,
|
fb->stride = DISPLAY_RESX;
|
||||||
.stride = DISPLAY_RESX,
|
|
||||||
};
|
|
||||||
#else
|
#else
|
||||||
display_fb_info_t fb = {
|
fb->ptr = drv->buffer->pixels;
|
||||||
.ptr = drv->buffer->pixels,
|
fb->stride = DISPLAY_RESX * sizeof(uint16_t);
|
||||||
.stride = DISPLAY_RESX * sizeof(uint16_t),
|
|
||||||
};
|
|
||||||
#endif
|
#endif
|
||||||
return fb;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,7 +114,9 @@ typedef struct {
|
|||||||
//
|
//
|
||||||
// If framebuffer is not available yet due to display refreshing etc.,
|
// If framebuffer is not available yet due to display refreshing etc.,
|
||||||
// the function may block until the buffer is ready to write.
|
// the function may block until the buffer is ready to write.
|
||||||
display_fb_info_t display_get_frame_buffer(void);
|
//
|
||||||
|
// Return `false` if the framebuffer is not available.
|
||||||
|
bool display_get_frame_buffer(display_fb_info_t *fb);
|
||||||
|
|
||||||
#else // XFRAMEBUFFER
|
#else // XFRAMEBUFFER
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user