Tufty 2040: RGB565 DMA display update.

Use DMA to transfer a native RGB565 display buffer to PIO rather than pushing into the TX FIFO in a loop.

Co-authored by @zx64 - https://github.com/pimoroni/pimoroni-pico/issues/776
This commit is contained in:
Phil Howard 2023-05-12 12:53:07 +01:00
parent 8648196cc2
commit 652de85f4d
1 changed files with 6 additions and 22 deletions

View File

@ -240,29 +240,13 @@ namespace pimoroni {
}
void ST7789::write_blocking_parallel(const uint8_t *src, size_t len) {
const uint8_t *p = src;
while(len--) {
// Does not byte align correctly
//pio_sm_put_blocking(parallel_pio, parallel_sm, *p);
while (pio_sm_is_tx_fifo_full(parallel_pio, parallel_sm))
;
*(volatile uint8_t*)&parallel_pio->txf[parallel_sm] = *p;
p++;
}
write_blocking_dma(src, len);
dma_channel_wait_for_finish_blocking(st_dma);
uint32_t sm_stall_mask = 1u << (parallel_sm + PIO_FDEBUG_TXSTALL_LSB);
parallel_pio->fdebug = sm_stall_mask;
while (!(parallel_pio->fdebug & sm_stall_mask))
;
/*uint32_t mask = 0xff << d0;
while(len--) {
gpio_put(wr_sck, false);
uint8_t v = *src++;
gpio_put_masked(mask, v << d0);
//asm("nop;");
gpio_put(wr_sck, true);
asm("nop;");
}*/
// This may cause a race between PIO and the
// subsequent chipselect deassert for the last pixel
while(!pio_sm_is_tx_fifo_empty(parallel_pio, parallel_sm))
;
}
void ST7789::command(uint8_t command, size_t len, const char *data) {