29 #include "freertos/FreeRTOS.h" 30 #include "freertos/task.h" 32 #include "soc/i2s_struct.h" 33 #include "soc/i2s_reg.h" 34 #include "driver/periph_ctrl.h" 35 #include "rom/lldesc.h" 37 #include "esp_spi_flash.h" 38 #include "esp_heap_caps.h" 59 VGADirectController * VGADirectController::s_instance =
nullptr;
60 volatile int VGADirectController::s_scanLine;
61 lldesc_t
volatile * VGADirectController::s_frameResetDesc;
65 VGADirectController::VGADirectController()
66 : m_drawScanlineCallback(nullptr)
72 void VGADirectController::init()
74 VGABaseController::init();
75 m_doubleBufferOverDMA =
false;
79 void VGADirectController::allocateViewPort()
81 for (
int i = 0; i < VGAD_LinesCount; ++i)
82 m_lines[i] = (uint8_t*) heap_caps_malloc(m_viewPortWidth, MALLOC_CAP_DMA);
86 void VGADirectController::freeViewPort()
88 VGABaseController::freeViewPort();
90 for (
int i = 0; i < VGAD_LinesCount; ++i) {
91 heap_caps_free((
void*)m_lines[i]);
97 void VGADirectController::setResolution(VGATimings
const& timings,
int viewPortWidth,
int viewPortHeight,
bool doubleBuffered)
100 if (!m_drawScanlineCallback)
103 VGABaseController::setResolution(timings, viewPortWidth, viewPortHeight, doubleBuffered);
109 if (m_isr_handle ==
nullptr) {
110 CoreUsage::setBusiestCore(FABGLIB_VIDEO_CPUINTENSIVE_TASKS_CORE);
111 esp_intr_alloc_pinnedToCore(ETS_I2S1_INTR_SOURCE, ESP_INTR_FLAG_LEVEL1 | ESP_INTR_FLAG_IRAM, ISRHandler,
this, &m_isr_handle, FABGLIB_VIDEO_CPUINTENSIVE_TASKS_CORE);
112 I2S1.int_clr.val = 0xFFFFFFFF;
113 I2S1.int_ena.out_eof = 1;
118 void VGADirectController::onSetupDMABuffer(lldesc_t
volatile * buffer,
bool isStartOfVertFrontPorch,
int scan,
bool isVisible,
int visibleRow)
121 buffer->buf = (uint8_t *) m_lines[visibleRow % VGAD_LinesCount];
124 if ((scan == 0 && (visibleRow % (VGAD_LinesCount / 2)) == 0)) {
126 s_frameResetDesc = buffer;
133 void VGADirectController::setPixelAt(PixelDesc
const & pixelDesc, Rect & updateRect)
138 void VGADirectController::absDrawLine(
int X1,
int Y1,
int X2,
int Y2, RGB888 color)
143 void VGADirectController::rawFillRow(
int y,
int x1,
int x2, RGB888 color)
148 void VGADirectController::rawFillRow(
int y,
int x1,
int x2, uint8_t colorIndex)
153 void VGADirectController::rawInvertRow(
int y,
int x1,
int x2)
158 void VGADirectController::rawCopyRow(
int x1,
int x2,
int srcY,
int dstY)
163 void VGADirectController::swapRows(
int yA,
int yB,
int x1,
int x2)
168 void VGADirectController::drawEllipse(Size
const & size, Rect & updateRect)
173 void VGADirectController::clear(Rect & updateRect)
178 void VGADirectController::VScroll(
int scroll, Rect & updateRect)
183 void VGADirectController::HScroll(
int scroll, Rect & updateRect)
188 void VGADirectController::drawGlyph(Glyph
const & glyph, GlyphOptions glyphOptions, RGB888 penColor, RGB888 brushColor, Rect & updateRect)
193 void VGADirectController::invertRect(Rect
const & rect, Rect & updateRect)
198 void VGADirectController::swapFGBG(Rect
const & rect, Rect & updateRect)
203 void VGADirectController::copyRect(Rect
const & source, Rect & updateRect)
208 void VGADirectController::readScreen(Rect
const & rect, RGB888 * destBuf)
213 void VGADirectController::rawDrawBitmap_Native(
int destX,
int destY, Bitmap
const * bitmap,
int X1,
int Y1,
int XCount,
int YCount)
218 void VGADirectController::rawDrawBitmap_Mask(
int destX,
int destY, Bitmap
const * bitmap,
void * saveBackground,
int X1,
int Y1,
int XCount,
int YCount)
223 void VGADirectController::rawDrawBitmap_RGBA2222(
int destX,
int destY, Bitmap
const * bitmap,
void * saveBackground,
int X1,
int Y1,
int XCount,
int YCount)
228 void VGADirectController::rawDrawBitmap_RGBA8888(
int destX,
int destY, Bitmap
const * bitmap,
void * saveBackground,
int X1,
int Y1,
int XCount,
int YCount)
233 void IRAM_ATTR VGADirectController::ISRHandler(
void * arg)
235 auto ctrl = (VGADirectController *) arg;
237 if (I2S1.int_st.out_eof) {
239 auto desc = (
volatile lldesc_t*) I2S1.out_eof_des_addr;
241 if (desc == s_frameResetDesc)
244 int scanLine = (s_scanLine + VGAD_LinesCount / 2) % ctrl->m_viewPortHeight;
246 auto lineIndex = scanLine % VGAD_LinesCount;
248 for (
int i = 0; i < VGAD_LinesCount / 2; ++i) {
250 ctrl->m_drawScanlineCallback(ctrl->m_drawScanlineArg, (uint8_t*)(ctrl->m_lines[lineIndex]), scanLine);
256 s_scanLine += VGAD_LinesCount / 2;
260 I2S1.int_clr.val = I2S1.int_st.val;
This file contains fabgl::GPIOStream definition.
This file contains some utility classes and functions.
This file contains fabgl::VGADirectController definition.