void platform_uart_rx_dma_irq( platform_uart_driver_t* driver ) { if ( ( get_dma_irq_status( driver->peripheral->rx_dma_config.stream ) & driver->peripheral->rx_dma_config.complete_flags ) != 0 ) { clear_dma_interrupts( driver->peripheral->rx_dma_config.stream, driver->peripheral->rx_dma_config.complete_flags ); driver->last_receive_result = kNoErr; } if ( ( get_dma_irq_status( driver->peripheral->rx_dma_config.stream ) & driver->peripheral->rx_dma_config.error_flags ) != 0 ) { clear_dma_interrupts( driver->peripheral->rx_dma_config.stream, driver->peripheral->rx_dma_config.error_flags ); driver->last_receive_result = kGeneralErr; } if ( driver->rx_size > 0 ) { /* Set semaphore regardless of result to prevent waiting thread from locking up */ mico_rtos_set_semaphore( &driver->rx_complete ); } }
static OSStatus spi_dma_transfer( const platform_spi_t* spi, const platform_spi_config_t* config ) { /* Enable dma channels that have just been configured */ DMA_Cmd( spi->rx_dma.stream, ENABLE ); DMA_Cmd( spi->tx_dma.stream, ENABLE ); /* Wait for DMA to complete */ /* TODO: This should wait on a semaphore that is triggered from an IRQ */ while ( ( get_dma_irq_status( spi->rx_dma.stream ) & spi->rx_dma.complete_flags ) == 0 ) { } return kNoErr; }
void platform_uart_tx_dma_irq( platform_uart_driver_t* driver ) { if ( ( get_dma_irq_status( driver->peripheral->tx_dma_config.stream ) & driver->peripheral->tx_dma_config.complete_flags ) != 0 ) { clear_dma_interrupts( driver->peripheral->tx_dma_config.stream, driver->peripheral->tx_dma_config.complete_flags ); driver->last_transmit_result = kNoErr; } if ( ( get_dma_irq_status( driver->peripheral->tx_dma_config.stream ) & driver->peripheral->tx_dma_config.error_flags ) != 0 ) { clear_dma_interrupts( driver->peripheral->tx_dma_config.stream, driver->peripheral->tx_dma_config.error_flags ); driver->last_transmit_result = kGeneralErr; } if ( driver->tx_size > 0 ) { #ifndef NO_MICO_RTOS /* Set semaphore regardless of result to prevent waiting thread from locking up */ mico_rtos_set_semaphore( &driver->tx_complete ); #else driver->tx_complete = true; #endif } }