#define SPI_DEBUG 0
#define SPI_USE_DMA 1
-/*
- * DMA is only used for USARTs in altos, which makes assigning DMA IDs
- * pretty easy
- */
-
-#define MISO_DMA_ID(id) ((uint8_t) ((id) * 2U + 0U))
-#define MOSI_DMA_ID(id) ((uint8_t) ((id) * 2U + 1U))
-
struct ao_spi_samd21_info {
struct samd21_sercom *sercom;
};
/* read any stuck data */
(void) sercom->data;
- _ao_dma_start_transfer(MISO_DMA_ID(id),
+ _ao_dma_start_transfer(AO_SERCOM_INPUT_DMA_ID(id),
(void *) &sercom->data,
i,
len,
(void *) (uintptr_t) id
);
- _ao_dma_start_transfer(MOSI_DMA_ID(id),
+ _ao_dma_start_transfer(AO_SERCOM_OUTPUT_DMA_ID(id),
o,
(void *) &sercom->data,
len,
while (ao_spi_done[id] == 0)
ao_sleep(&ao_spi_done[id]);
- _ao_dma_done_transfer(MOSI_DMA_ID(id));
- _ao_dma_done_transfer(MISO_DMA_ID(id));
+ _ao_dma_done_transfer(AO_SERCOM_OUTPUT_DMA_ID(id));
+ _ao_dma_done_transfer(AO_SERCOM_INPUT_DMA_ID(id));
ao_arch_release_interrupts();
}
ao_enable_output(&samd21_port_a, 5, 1);
ao_enable_input(&samd21_port_a, 6, AO_MODE_PULL_NONE);
- samd21_port_pmux_set(&samd21_port_a, 4, SAMD21_PORT_PMUX_FUNC_C); /* MOSI */
- samd21_port_pmux_set(&samd21_port_a, 5, SAMD21_PORT_PMUX_FUNC_C); /* SCLK */
- samd21_port_pmux_set(&samd21_port_a, 6, SAMD21_PORT_PMUX_FUNC_C); /* MISO */
+ samd21_port_pmux_set(&samd21_port_a, 4, SAMD21_PORT_PMUX_FUNC_D); /* MOSI */
+ samd21_port_pmux_set(&samd21_port_a, 5, SAMD21_PORT_PMUX_FUNC_D); /* SCLK */
+ samd21_port_pmux_set(&samd21_port_a, 6, SAMD21_PORT_PMUX_FUNC_D); /* MISO */
break;
#endif
#if HAS_SPI_3