From 5971bc9ad8908af9bf3b3276096769061c94f2e0 Mon Sep 17 00:00:00 2001 From: Mike Bell Date: Wed, 17 May 2023 21:22:09 +0100 Subject: [PATCH] Streamline RAM writes --- drivers/aps6404/aps6404.cpp | 64 +++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 28 deletions(-) diff --git a/drivers/aps6404/aps6404.cpp b/drivers/aps6404/aps6404.cpp index 5cd9aa0e..3638f19c 100644 --- a/drivers/aps6404/aps6404.cpp +++ b/drivers/aps6404/aps6404.cpp @@ -98,19 +98,29 @@ namespace pimoroni { } void APS6404::write(uint32_t addr, uint32_t* data, uint32_t len_in_bytes) { - dma_channel_config c = dma_channel_get_default_config(dma_channel); - channel_config_set_read_increment(&c, true); - channel_config_set_write_increment(&c, false); - channel_config_set_dreq(&c, pio_get_dreq(pio, pio_sm, true)); - channel_config_set_transfer_data_size(&c, DMA_SIZE_32); - channel_config_set_bswap(&c, true); - if (!last_cmd_was_write) { + dma_channel_config c = dma_channel_get_default_config(dma_channel); + channel_config_set_read_increment(&c, true); + channel_config_set_write_increment(&c, false); + channel_config_set_dreq(&c, pio_get_dreq(pio, pio_sm, true)); + channel_config_set_transfer_data_size(&c, DMA_SIZE_32); + channel_config_set_bswap(&c, true); + wait_for_finish_blocking(); setup_cmd_buffer_dma(true); last_cmd_was_write = true; + + dma_channel_configure( + dma_channel, &c, + &pio->txf[pio_sm], + nullptr, + 1, + false + ); } + hw_set_bits(&dma_hw->ch[dma_channel].al1_ctrl, DMA_CH0_CTRL_TRIG_INCR_READ_BITS); + for (int len = len_in_bytes, page_len = std::min(PAGE_SIZE, len); len > 0; addr += page_len, data += page_len >> 2, len -= page_len, page_len = std::min(PAGE_SIZE, len)) @@ -121,30 +131,34 @@ namespace pimoroni { pio_sm_put_blocking(pio, pio_sm, 0x38000000u | addr); pio_sm_put_blocking(pio, pio_sm, pio_offset + sram_offset_do_write); - dma_channel_configure( - dma_channel, &c, - &pio->txf[pio_sm], - data, - (page_len >> 2) + 1, - true - ); + dma_channel_transfer_from_buffer_now(dma_channel, data, (page_len >> 2) + 1); } } void APS6404::write_repeat(uint32_t addr, uint32_t data, uint32_t len_in_bytes) { - dma_channel_config c = dma_channel_get_default_config(dma_channel); - channel_config_set_read_increment(&c, false); - channel_config_set_write_increment(&c, false); - channel_config_set_dreq(&c, pio_get_dreq(pio, pio_sm, true)); - channel_config_set_transfer_data_size(&c, DMA_SIZE_32); - channel_config_set_bswap(&c, true); - if (!last_cmd_was_write) { + dma_channel_config c = dma_channel_get_default_config(dma_channel); + channel_config_set_read_increment(&c, false); + channel_config_set_write_increment(&c, false); + channel_config_set_dreq(&c, pio_get_dreq(pio, pio_sm, true)); + channel_config_set_transfer_data_size(&c, DMA_SIZE_32); + channel_config_set_bswap(&c, true); + wait_for_finish_blocking(); setup_cmd_buffer_dma(true); last_cmd_was_write = true; + + dma_channel_configure( + dma_channel, &c, + &pio->txf[pio_sm], + nullptr, + 1, + false + ); } + hw_clear_bits(&dma_hw->ch[dma_channel].al1_ctrl, DMA_CH0_CTRL_TRIG_INCR_READ_BITS); + for (int len = len_in_bytes, page_len = std::min(PAGE_SIZE, len); len > 0; addr += page_len, len -= page_len, page_len = std::min(PAGE_SIZE, len)) @@ -156,13 +170,7 @@ namespace pimoroni { pio_sm_put_blocking(pio, pio_sm, 0x38000000u | addr); pio_sm_put_blocking(pio, pio_sm, pio_offset + sram_offset_do_write); - dma_channel_configure( - dma_channel, &c, - &pio->txf[pio_sm], - &repeat_data, - (page_len >> 2) + 1, - true - ); + dma_channel_transfer_from_buffer_now(dma_channel, &repeat_data, (page_len >> 2) + 1); } }