Tweak display DMA buffer size

custom
jacqueline 2 years ago
parent 0032896251
commit 02c1eb4be3
  1. 7
      src/drivers/display.cpp
  2. 6
      src/drivers/spi.cpp

@ -14,6 +14,7 @@
#include "assert.h" #include "assert.h"
#include "driver/gpio.h" #include "driver/gpio.h"
#include "driver/ledc.h" #include "driver/ledc.h"
#include "driver/spi_common.h"
#include "driver/spi_master.h" #include "driver/spi_master.h"
#include "esp_attr.h" #include "esp_attr.h"
#include "esp_err.h" #include "esp_err.h"
@ -47,16 +48,16 @@ static const gpio_num_t kDisplayCs = GPIO_NUM_22;
/* /*
* The size of each of our two display buffers. This is fundamentally a balance * The size of each of our two display buffers. This is fundamentally a balance
* between performance and memory usage. LVGL docs recommend a buffer 1/10th the * between performance and memory usage. LVGL docs recommend a buffer 1/10th the
* size of the screen is the best tradeoff. * size of the screen is the best tradeoff, but we instead just use the max DMA
* buffer size.
* We use two buffers so that one can be flushed to the screen at the same time * We use two buffers so that one can be flushed to the screen at the same time
* as the other is being drawn. * as the other is being drawn.
*/ */
static const int kDisplayBufferSize = (kDisplayWidth * kDisplayHeight) / 10; static const int kDisplayBufferSize = SPI_MAX_DMA_LEN;
// Allocate both buffers in static memory to ensure that they're in DRAM, with // Allocate both buffers in static memory to ensure that they're in DRAM, with
// minimal fragmentation. We most cases we always need these buffers anyway, so // minimal fragmentation. We most cases we always need these buffers anyway, so
// it's not a memory hit we can avoid. // it's not a memory hit we can avoid.
// Note: 128 * 160 / 10 * 2 bpp * 2 buffers = 8 KiB
DMA_ATTR static lv_color_t sBuffer1[kDisplayBufferSize]; DMA_ATTR static lv_color_t sBuffer1[kDisplayBufferSize];
DMA_ATTR static lv_color_t sBuffer2[kDisplayBufferSize]; DMA_ATTR static lv_color_t sBuffer2[kDisplayBufferSize];

@ -35,12 +35,10 @@ esp_err_t init_spi(void) {
.data7_io_num = -1, .data7_io_num = -1,
// Use the DMA default size. The display requires larger buffers, but it // Use the DMA default size. The display requires larger buffers, but it
// manages its down use of DMA-capable memory. // manages its own use of DMA-capable memory.
.max_transfer_sz = 128 * 16 * 2, // TODO: hmm .max_transfer_sz = 4096,
.flags = SPICOMMON_BUSFLAG_MASTER | SPICOMMON_BUSFLAG_IOMUX_PINS, .flags = SPICOMMON_BUSFLAG_MASTER | SPICOMMON_BUSFLAG_IOMUX_PINS,
.intr_flags = ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_IRAM, .intr_flags = ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_IRAM,
//.intr_flags = ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_SHARED |
// ESP_INTR_FLAG_IRAM,
}; };
if (esp_err_t err = spi_bus_initialize(kSpiHost, &config, SPI_DMA_CH_AUTO)) { if (esp_err_t err = spi_bus_initialize(kSpiHost, &config, SPI_DMA_CH_AUTO)) {

Loading…
Cancel
Save