38 #include "rom/lldesc.h" 39 #include "driver/gpio.h" 41 #include "freertos/FreeRTOS.h" 42 #include "freertos/queue.h" 53 #define VGA_GREEN_BIT 2 54 #define VGA_BLUE_BIT 4 55 #define VGA_HSYNC_BIT 6 56 #define VGA_VSYNC_BIT 7 58 #define VGA_SYNC_MASK ((1 << VGA_HSYNC_BIT) | (1 << VGA_VSYNC_BIT)) 66 #define VGA_PIXELINROW(row, X) (row[(X) ^ 2]) 69 #define VGA_PIXEL(X, Y) VGA_PIXELINROW(m_viewPort[(Y)], X) 70 #define VGA_INVERT_PIXEL(X, Y) { auto px = &VGA_PIXEL((X), (Y)); *px = ~(*px ^ VGA_SYNC_MASK); } 110 class VGABaseController :
public GenericBitmappedDisplayController {
117 VGABaseController(VGABaseController
const&) =
delete;
118 void operator=(VGABaseController
const&) =
delete;
136 void begin(gpio_num_t redGPIO, gpio_num_t greenGPIO, gpio_num_t blueGPIO, gpio_num_t HSyncGPIO, gpio_num_t VSyncGPIO);
157 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);
173 static bool convertModelineToTimings(
char const * modeline,
VGATimings * timings);
176 virtual void suspendBackgroundPrimitiveExecution();
179 virtual void resumeBackgroundPrimitiveExecution();
208 void setResolution(
char const * modeline,
int viewPortWidth = -1,
int viewPortHeight = -1,
bool doubleBuffered =
false);
210 virtual void setResolution(
VGATimings const& timings,
int viewPortWidth = -1,
int viewPortHeight = -1,
bool doubleBuffered =
false);
217 int getViewPortCol() {
return m_viewPortCol; }
224 int getViewPortRow() {
return m_viewPortRow; }
227 int getViewPortWidth() {
return m_viewPortWidth; }
230 int getViewPortHeight() {
return m_viewPortHeight; }
245 void moveScreen(
int offsetX,
int offsetY);
261 void shrinkScreen(
int shrinkX,
int shrinkY);
263 VGATimings * getResolutionTimings() {
return &m_timings; }
272 uint8_t getBitsPerChannel() {
return m_bitsPerChannel; }
287 uint8_t * getScanline(
int y) {
return (uint8_t*) m_viewPort[y]; }
301 uint8_t createRawPixel(RGB222 rgb) {
return preparePixel(rgb); }
317 void setRawPixel(
int x,
int y, uint8_t rgb) { VGA_PIXEL(x, y) = rgb; }
322 static void setupGPIO(gpio_num_t gpio,
int bit, gpio_mode_t mode);
324 void startGPIOStream();
328 virtual void freeViewPort();
332 bool setDMABuffersCount(
int buffersCount);
334 uint8_t packHVSync(
bool HSync,
bool VSync);
336 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); }
338 uint8_t preparePixelWithSync(RGB222 rgb,
bool HSync,
bool VSync);
340 void fillVertBuffers(
int offsetY);
342 void fillHorizBuffers(
int offsetX);
344 int fill(uint8_t
volatile * buffer,
int startPos,
int length, uint8_t red, uint8_t green, uint8_t blue,
bool hsync,
bool vsync);
346 int calcRequiredDMABuffersCount(
int viewPortHeight);
348 bool isMultiScanBlackLine(
int scan);
350 void setDMABufferBlank(
int index,
void volatile * address,
int length,
int scan,
bool isStartOfVertFrontPorch);
351 void setDMABufferView(
int index,
int row,
int scan,
volatile uint8_t * * viewPort,
bool onVisibleDMA);
352 void setDMABufferView(
int index,
int row,
int scan,
bool isStartOfVertFrontPorch);
354 virtual void onSetupDMABuffer(lldesc_t
volatile * buffer,
bool isStartOfVertFrontPorch,
int scan,
bool isVisible,
int visibleRow) = 0;
356 void volatile * getDMABuffer(
int index,
int * length);
358 void allocateViewPort(uint32_t allocCaps,
int rowlen);
359 virtual void allocateViewPort() = 0;
360 virtual void checkViewPortSize() { };
363 virtual void swapBuffers();
368 volatile uint8_t * * m_viewPort;
369 volatile uint8_t * * m_viewPortVisible;
372 bool m_doubleBufferOverDMA;
374 volatile int m_primitiveProcessingSuspended;
376 volatile int16_t m_viewPortWidth;
377 volatile int16_t m_viewPortHeight;
379 intr_handle_t m_isr_handle;
381 VGATimings m_timings;
384 volatile int16_t m_viewPortCol;
385 volatile int16_t m_viewPortRow;
388 volatile uint8_t m_HVSync;
396 int m_bitsPerChannel;
398 GPIOStream m_GPIOStream;
400 lldesc_t
volatile * m_DMABuffers;
401 int m_DMABuffersCount;
405 lldesc_t
volatile * m_DMABuffersHead;
406 lldesc_t
volatile * m_DMABuffersVisible;
410 volatile uint8_t * m_HBlankLine_withVSync;
411 volatile uint8_t * m_HBlankLine;
413 uint8_t * m_viewPortMemoryPool[FABGLIB_VIEWPORT_MEMORY_POOL_COUNT + 1];
415 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.
This file contains FabGL library configuration settings, like number of supported colors...
VGAScanStart HStartingBlock