Files
rp_pico_display_engine/include/display/display.h
T

178 lines
4.0 KiB
C

#pragma once
#include <stdint.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
/* ============================================================
=== Compile-time configuration
============================================================ */
/*
* Максимальное количество буферов,
* доступное в данной сборке.
*
* RP2040: обычно 1
* RP2350: можно 2
*/
#ifndef DISPLAY_MAX_BUFFERS
#define DISPLAY_MAX_BUFFERS 2
#endif
/* ============================================================
=== Modes
============================================================ */
typedef enum
{
/*
* SAFE:
* - swap управляется engine
* - нет tearing при 2 буферах
* - возможны блокировки
*/
DISPLAY_MODE_SAFE = 0,
/*
* RAW:
* - swap управляется пользователем
* - engine не блокирует
* - tearing возможен
*/
DISPLAY_MODE_RAW
} display_mode_t;
/* ============================================================
=== Callback
============================================================ */
typedef void (*display_frame_done_cb_t)(void);
/* ============================================================
=== Configuration
============================================================ */
typedef struct
{
uint16_t width;
uint16_t height;
/*
* 1 или 2.
* Должно быть <= DISPLAY_MAX_BUFFERS.
*/
uint8_t buffer_count;
display_mode_t mode;
/*
* Вызывается после завершения DMA
* через display_poll().
* Может быть NULL.
*/
display_frame_done_cb_t frame_done_cb;
} display_config_t;
/* ============================================================
=== Lifecycle
============================================================ */
/*
* Инициализация display engine.
* Выделяет буферы и инициализирует HW.
*/
void display_init(const display_config_t* cfg);
/* ============================================================
=== Buffer access
============================================================ */
/*
* Буфер для рисования.
*
* SAFE + 1 buffer:
* может блокировать пока DMA активен.
*
* RAW:
* никогда не блокирует.
*/
uint16_t* display_get_draw_buffer(void);
/*
* Буфер, который сейчас передаётся DMA.
*/
uint16_t* display_get_scanout_buffer(void);
/* ============================================================
=== Buffer control (RAW mode only)
============================================================ */
/*
* Явная смена ролей draw/scanout.
*
* Возвращает false если:
* - не RAW режим
* - меньше 2 буферов
* - DMA активен
*/
bool display_swap_buffers(void);
/* ============================================================
=== Frame control
============================================================ */
/*
* Запуск передачи текущего scanout буфера.
*
* Возвращает false если DMA активен.
*/
bool display_submit(void);
/*
* true если DMA не активен.
*/
bool display_ready(void);
/*
* Блокирующее ожидание завершения DMA.
*/
void display_wait(void);
/*
* Обработка отложенного события завершения кадра.
* Должна вызываться из основного цикла.
*/
void display_poll(void);
/* ============================================================
=== IRQ hook
============================================================ */
/*
* Должен вызываться из реального DMA IRQ handler.
*/
void display_dma_irq_handler(void);
#ifdef __cplusplus
}
#endif