1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-01-31 18:00:58 +00:00

fixup! feat(core): display driver for T3W1

This commit is contained in:
tychovrahe 2024-12-11 16:17:07 +01:00
parent 5b29060167
commit 6687a95b8e
2 changed files with 19 additions and 17 deletions

View File

@ -111,7 +111,8 @@ bool display_get_frame_buffer(display_fb_info_t *fb_dest) {
#define FB_PIXEL_SIZE 2 #define FB_PIXEL_SIZE 2
#endif #endif
int16_t fb_idx = fb_queue_get_for_write(&drv->queue); fb_queue_wait(&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->ptr = NULL;
@ -146,16 +147,13 @@ void display_refresh(void) {
return; return;
} }
int16_t fb_idx = fb_queue_get_for_copy(&drv->queue); if (!fb_queue_peeked(&drv->empty_frames)) {
if (fb_idx < 0) {
// No refresh needed as the frame buffer is not in // No refresh needed as the frame buffer is not in
// the state to be copied to the display // the state to be copied to the display
return; return;
} }
// Mark the buffer ready to switch to fb_queue_put(&drv->ready_frames, fb_queue_take(&drv->empty_frames));
fb_queue_set_ready_for_transfer(&drv->queue);
} }
void display_ensure_refreshed(void) { void display_ensure_refreshed(void) {
@ -172,7 +170,7 @@ void display_ensure_refreshed(void) {
// so we can be sure there's not scheduled or pending // so we can be sure there's not scheduled or pending
// background copying // background copying
do { do {
copy_pending = !fb_queue_is_processed(&drv->queue); copy_pending = !fb_queue_empty(&drv->ready_frames);
__WFI(); __WFI();
} while (copy_pending || drv->update_pending > 0); } while (copy_pending || drv->update_pending > 0);
} }
@ -187,15 +185,14 @@ void display_fb_clear(void) {
} }
uint32_t display_fb_get_initial_addr(void) { uint32_t display_fb_get_initial_addr(void) {
display_fb_info_t fb_info; fb_queue_reset(&g_display_driver.empty_frames);
fb_queue_reset(&g_display_driver.ready_frames);
display_get_frame_buffer(&fb_info); fb_queue_put(&g_display_driver.empty_frames, 1);
fb_queue_set_ready_for_transfer(&g_display_driver.queue); g_display_driver.active_frame = 0;
fb_queue_get_for_transfer(&g_display_driver.queue); return (uint32_t)get_fb_ptr(0);
return (uint32_t)fb_info.ptr;
} }
void HAL_LTDC_LineEvenCallback(LTDC_HandleTypeDef *hltdc) { void HAL_LTDC_LineEvenCallback(LTDC_HandleTypeDef *hltdc) {
@ -209,10 +206,11 @@ void HAL_LTDC_LineEvenCallback(LTDC_HandleTypeDef *hltdc) {
drv->update_pending--; drv->update_pending--;
} }
int16_t fb_idx = fb_queue_get_for_transfer(&drv->queue); int16_t fb_idx = fb_queue_take(&drv->ready_frames);
if (fb_idx >= 0) { if (fb_idx >= 0) {
fb_queue_set_switched(&drv->queue); fb_queue_put(&drv->empty_frames, drv->active_frame);
display_set_fb((uint32_t)get_fb_ptr(fb_idx)); drv->active_frame = fb_idx;
display_set_fb((uint32_t)get_fb_ptr(drv->active_frame));
drv->update_pending = 3; drv->update_pending = 3;
} }

View File

@ -41,7 +41,11 @@
typedef struct { typedef struct {
bool initialized; bool initialized;
uint16_t update_pending; uint16_t update_pending;
frame_buffer_queue_t queue;
fb_queue_t empty_frames;
fb_queue_t ready_frames;
int16_t active_frame;
// Current display orientation (0, 90, 180, 270) // Current display orientation (0, 90, 180, 270)
int orientation_angle; int orientation_angle;