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; }
296 uint8_t * getScanline(
int y) {
return (uint8_t*) m_viewPort[y]; }
310 uint8_t createRawPixel(RGB222 rgb) {
return preparePixel(rgb); }
312 uint8_t createBlankRawPixel() {
return m_HVSync; }
318 static void setupGPIO(gpio_num_t gpio,
int bit, gpio_mode_t mode);
320 void startGPIOStream();
324 virtual void freeViewPort();
328 bool setDMABuffersCount(
int buffersCount);
330 uint8_t packHVSync(
bool HSync,
bool VSync);
332 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); }
334 uint8_t preparePixelWithSync(RGB222 rgb,
bool HSync,
bool VSync);
336 void fillVertBuffers(
int offsetY);
338 void fillHorizBuffers(
int offsetX);
340 int fill(uint8_t
volatile * buffer,
int startPos,
int length, uint8_t red, uint8_t green, uint8_t blue,
bool hsync,
bool vsync);
342 int calcRequiredDMABuffersCount(
int viewPortHeight);
344 bool isMultiScanBlackLine(
int scan);
346 void setDMABufferBlank(
int index,
void volatile * address,
int length,
int scan,
bool isStartOfVertFrontPorch);
347 void setDMABufferView(
int index,
int row,
int scan,
volatile uint8_t * * viewPort,
bool onVisibleDMA);
348 void setDMABufferView(
int index,
int row,
int scan,
bool isStartOfVertFrontPorch);
350 virtual void onSetupDMABuffer(lldesc_t
volatile * buffer,
bool isStartOfVertFrontPorch,
int scan,
bool isVisible,
int visibleRow) = 0;
352 void volatile * getDMABuffer(
int index,
int * length);
354 void allocateViewPort(uint32_t allocCaps,
int rowlen);
355 virtual void allocateViewPort() = 0;
356 virtual void checkViewPortSize() { };
359 virtual void swapBuffers();
364 volatile uint8_t * * m_viewPort;
365 volatile uint8_t * * m_viewPortVisible;
368 bool m_doubleBufferOverDMA;
370 volatile int m_primitiveProcessingSuspended;
372 volatile int16_t m_viewPortWidth;
373 volatile int16_t m_viewPortHeight;
375 intr_handle_t m_isr_handle;
377 VGATimings m_timings;
380 volatile int16_t m_viewPortCol;
381 volatile int16_t m_viewPortRow;
384 volatile uint8_t m_HVSync;
392 int m_bitsPerChannel;
394 GPIOStream m_GPIOStream;
396 lldesc_t
volatile * m_DMABuffers;
397 int m_DMABuffersCount;
401 lldesc_t
volatile * m_DMABuffersHead;
402 lldesc_t
volatile * m_DMABuffersVisible;
406 volatile uint8_t * m_HBlankLine_withVSync;
407 volatile uint8_t * m_HBlankLine;
411 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