+}
+
+static void
+ao_spi_finish_send(uint8_t spi_index)
+{
+ uint8_t mosi_dma_index = ao_spi_stm_info[spi_index].mosi_dma_index;
+ uint8_t miso_dma_index = ao_spi_stm_info[spi_index].miso_dma_index;
+
+ ao_dma_done_transfer(mosi_dma_index);
+ ao_dma_done_transfer(miso_dma_index);
+}
+
+void
+ao_spi_dma_isr(int spi_index)
+{
+ ao_spi_callback[spi_index](spi_index);
+ ao_spi_finish_send(spi_index);
+}
+
+void
+ao_spi_queue_send(void *block, uint16_t len, uint8_t spi_index,
+ void (*callback)(int spi_index))
+{
+ uint8_t miso_dma_index = ao_spi_stm_info[spi_index].miso_dma_index;
+
+ ao_spi_setup_send(block, len, spi_index);
+ ao_spi_callback[spi_index] = callback;
+ ao_dma_set_isr(miso_dma_index, ao_spi_dma_isr, spi_index);
+ ao_spi_start_send(spi_index);
+}
+
+void
+ao_spi_send(void *block, uint16_t len, uint8_t spi_index)
+{
+ uint8_t mosi_dma_index = ao_spi_stm_info[spi_index].mosi_dma_index;
+ uint8_t miso_dma_index = ao_spi_stm_info[spi_index].miso_dma_index;
+
+ ao_spi_setup_send(block, len, spi_index);
+ ao_spi_start_send(spi_index);