42 #include "driver/gpio.h" 44 #include "freertos/FreeRTOS.h" 45 #include "freertos/queue.h" 56 #define VGA_GREEN_BIT 2 57 #define VGA_BLUE_BIT 4 58 #define VGA_HSYNC_BIT 6 59 #define VGA_VSYNC_BIT 7 61 #define VGA_SYNC_MASK ((1 << VGA_HSYNC_BIT) | (1 << VGA_VSYNC_BIT)) 69 #define VGA_PIXELINROW(row, X) (row[(X) ^ 2]) 72 #define VGA_PIXEL(X, Y) VGA_PIXELINROW(m_viewPort[(Y)], X) 73 #define VGA_INVERT_PIXEL(X, Y) { auto px = &VGA_PIXEL((X), (Y)); *px = ~(*px ^ VGA_SYNC_MASK); } 81 #if FABGLIB_VGAXCONTROLLER_PERFORMANCE_CHECK 82 extern volatile uint64_t s_vgapalctrlcycles;
119 class VGABaseController :
public GenericBitmappedDisplayController {
126 VGABaseController(VGABaseController
const&) =
delete;
127 void operator=(VGABaseController
const&) =
delete;
145 void begin(gpio_num_t redGPIO, gpio_num_t greenGPIO, gpio_num_t blueGPIO, gpio_num_t HSyncGPIO, gpio_num_t VSyncGPIO);
166 void begin(gpio_num_t red1GPIO, gpio_num_t red0GPIO, gpio_num_t green1GPIO, gpio_num_t green0GPIO, gpio_num_t blue1GPIO, gpio_num_t blue0GPIO, gpio_num_t HSyncGPIO, gpio_num_t VSyncGPIO);
182 static bool convertModelineToTimings(
char const * modeline,
VGATimings * timings);
185 virtual void suspendBackgroundPrimitiveExecution();
188 virtual void resumeBackgroundPrimitiveExecution();
217 void setResolution(
char const * modeline,
int viewPortWidth = -1,
int viewPortHeight = -1,
bool doubleBuffered =
false);
219 virtual void setResolution(
VGATimings const& timings,
int viewPortWidth = -1,
int viewPortHeight = -1,
bool doubleBuffered =
false);
226 int getViewPortCol() {
return m_viewPortCol; }
233 int getViewPortRow() {
return m_viewPortRow; }
236 int getViewPortWidth() {
return m_viewPortWidth; }
239 int getViewPortHeight() {
return m_viewPortHeight; }
254 void moveScreen(
int offsetX,
int offsetY);
270 void shrinkScreen(
int shrinkX,
int shrinkY);
272 VGATimings * getResolutionTimings() {
return &m_timings; }
281 uint8_t getBitsPerChannel() {
return m_bitsPerChannel; }
283 virtual int colorsCount() {
return 1 << (3 * m_bitsPerChannel); }
298 uint8_t * getScanline(
int y) {
return (uint8_t*) m_viewPort[y]; }
312 uint8_t createRawPixel(RGB222 rgb) {
return preparePixel(rgb); }
314 uint8_t createBlankRawPixel() {
return m_HVSync; }
320 static void setupGPIO(gpio_num_t gpio,
int bit, gpio_mode_t mode);
322 void startGPIOStream();
326 virtual void freeViewPort();
330 bool setDMABuffersCount(
int buffersCount);
332 uint8_t packHVSync(
bool HSync,
bool VSync);
334 uint8_t
inline __attribute__((always_inline)) preparePixel(RGB222 rgb) {
return m_HVSync | (rgb.B << VGA_BLUE_BIT) | (rgb.G << VGA_GREEN_BIT) | (rgb.R << VGA_RED_BIT); }
336 uint8_t preparePixelWithSync(RGB222 rgb,
bool HSync,
bool VSync);
338 void fillVertBuffers(
int offsetY);
340 void fillHorizBuffers(
int offsetX);
342 int fill(uint8_t
volatile * buffer,
int startPos,
int length, uint8_t red, uint8_t green, uint8_t blue,
bool hsync,
bool vsync);
344 int calcRequiredDMABuffersCount(
int viewPortHeight);
346 bool isMultiScanBlackLine(
int scan);
348 void setDMABufferBlank(
int index,
void volatile * address,
int length,
int scan,
bool isStartOfVertFrontPorch);
349 void setDMABufferView(
int index,
int row,
int scan,
volatile uint8_t * * viewPort,
bool onVisibleDMA);
350 void setDMABufferView(
int index,
int row,
int scan,
bool isStartOfVertFrontPorch);
352 virtual void onSetupDMABuffer(lldesc_t
volatile * buffer,
bool isStartOfVertFrontPorch,
int scan,
bool isVisible,
int visibleRow) = 0;
354 void volatile * getDMABuffer(
int index,
int * length);
356 void allocateViewPort(uint32_t allocCaps,
int rowlen);
357 virtual void allocateViewPort() = 0;
358 virtual void checkViewPortSize() { };
361 virtual void swapBuffers();
366 volatile uint8_t * * m_viewPort;
367 volatile uint8_t * * m_viewPortVisible;
370 bool m_doubleBufferOverDMA;
372 volatile int m_primitiveProcessingSuspended;
374 volatile int16_t m_viewPortWidth;
375 volatile int16_t m_viewPortHeight;
377 intr_handle_t m_isr_handle;
379 VGATimings m_timings;
382 volatile int16_t m_viewPortCol;
383 volatile int16_t m_viewPortRow;
386 volatile uint8_t m_HVSync;
394 int m_bitsPerChannel;
396 GPIOStream m_GPIOStream;
398 lldesc_t
volatile * m_DMABuffers;
399 int m_DMABuffersCount;
403 lldesc_t
volatile * m_DMABuffersHead;
404 lldesc_t
volatile * m_DMABuffersVisible;
408 volatile uint8_t * m_HBlankLine_withVSync;
409 volatile uint8_t * m_HBlankLine;
413 int16_t m_rawFrameHeight;
This file contains fabgl::GPIOStream definition.
This file contains fabgl::BitmappedDisplayController definition.
VGAScanStart
Represents one of the four blocks of horizontal or vertical line.
Specifies the VGA timings. This is a modeline decoded.
This file contains some utility classes and functions.
#define FABGLIB_VIEWPORT_MEMORY_POOL_COUNT
This file contains FabGL library configuration settings, like number of supported colors...
VGAScanStart HStartingBlock