Support USARTs up to USART5 in SPI

pull/5634/head
Steven Cooreman 2017-11-24 15:53:44 +01:00 committed by adbridge
parent e23ce9d87a
commit b11914c967
1 changed files with 84 additions and 0 deletions

View File

@ -59,6 +59,18 @@ static inline CMU_Clock_TypeDef spi_get_clock_tree(spi_t *obj)
#ifdef USART2
case SPI_2:
return cmuClock_USART2;
#endif
#ifdef USART3
case SPI_3:
return cmuClock_USART3;
#endif
#ifdef USART4
case SPI_4:
return cmuClock_USART4;
#endif
#ifdef USART5
case SPI_5:
return cmuClock_USART5;
#endif
default:
error("Spi module not available.. Out of bound access.");
@ -84,6 +96,21 @@ static inline uint8_t spi_get_index(spi_t *obj)
case SPI_2:
index = 2;
break;
#endif
#ifdef USART3
case SPI_3:
index = 3;
break;
#endif
#ifdef USART4
case SPI_4:
index = 4;
break;
#endif
#ifdef USART5
case SPI_5:
index = 5;
break;
#endif
default:
error("Spi module not available.. Out of bound access.");
@ -286,6 +313,21 @@ void spi_enable_interrupt(spi_t *obj, uint32_t handler, uint8_t enable)
case USART_2:
IRQvector = USART2_RX_IRQn;
break;
#endif
#ifdef USART3
case USART_3:
IRQvector = USART3_RX_IRQn;
break;
#endif
#ifdef USART4
case USART_4:
IRQvector = USART4_RX_IRQn;
break;
#endif
#ifdef USART5
case USART_5:
IRQvector = USART5_RX_IRQn;
break;
#endif
default:
error("Undefined SPI peripheral");
@ -770,6 +812,24 @@ static void spi_master_dma_channel_setup(spi_t *obj, void* callback)
rxChnlCfg.select = DMAREQ_USART2_RXDATAV;
txChnlCfg.select = DMAREQ_USART2_TXEMPTY;
break;
#endif
#ifdef USART3
case SPI_3:
rxChnlCfg.select = DMAREQ_USART3_RXDATAV;
txChnlCfg.select = DMAREQ_USART3_TXEMPTY;
break;
#endif
#ifdef USART4
case SPI_4:
rxChnlCfg.select = DMAREQ_USART4_RXDATAV;
txChnlCfg.select = DMAREQ_USART4_TXEMPTY;
break;
#endif
#ifdef USART5
case SPI_5:
rxChnlCfg.select = DMAREQ_USART5_RXDATAV;
txChnlCfg.select = DMAREQ_USART5_TXEMPTY;
break;
#endif
default:
error("Spi module not available.. Out of bound access.");
@ -799,12 +859,36 @@ static void spi_activate_dma(spi_t *obj, void* rxdata, const void* txdata, int t
/* Select RX source address. 9 bit frame length requires to use extended register.
10 bit and larger frame requires to use RXDOUBLE register. */
switch((int)obj->spi.spi) {
#ifdef USART0
case USART_0:
dma_periph = ldmaPeripheralSignal_USART0_RXDATAV;
break;
#endif
#ifdef USART1
case USART_1:
dma_periph = ldmaPeripheralSignal_USART1_RXDATAV;
break;
#endif
#ifdef USART2
case USART_2:
dma_periph = ldmaPeripheralSignal_USART2_RXDATAV;
break;
#endif
#ifdef USART3
case USART_3:
dma_periph = ldmaPeripheralSignal_USART3_RXDATAV;
break;
#endif
#ifdef USART4
case USART_4:
dma_periph = ldmaPeripheralSignal_USART4_RXDATAV;
break;
#endif
#ifdef USART5
case USART_5:
dma_periph = ldmaPeripheralSignal_USART5_RXDATAV;
break;
#endif
default:
EFM_ASSERT(0);
while(1);