SPI is configured as DMA mode by default;Fix i2s_stop

pull/60/head
xiangbingj 2019-11-07 20:02:01 +08:00
parent 60852bdbcb
commit 2eee33c274
11 changed files with 23 additions and 1 deletions

6
.vscode/settings.json vendored Executable file
View File

@ -0,0 +1,6 @@
{
"files.associations": {
"fft_soft.h": "c",
"devices.h": "c"
}
}

0
lib/arch/include/iomem.h Normal file → Executable file
View File

View File

@ -530,6 +530,10 @@ public:
dmac.chen |= 0x101 << channel_;
}
virtual void stop() override
{
atomic_set(session_.stop_signal, 1);
}
private:
static void dma_completion_isr(void *userdata)
{

0
lib/bsp/device/fft.cpp Normal file → Executable file
View File

5
lib/bsp/device/i2s.cpp Normal file → Executable file
View File

@ -27,6 +27,8 @@
using namespace sys;
#define I2S_DMA_BLOCK_TIME 1000UL
#define BUFFER_COUNT 2
#define COMMON_ENTRY \
i2s_data *data = (i2s_data *)userdata; \
@ -373,6 +375,9 @@ public:
virtual void stop() override
{
dma_stop(session_.transmit_dma);
configASSERT(pdTRUE == xSemaphoreTake(session_.completion_event, I2S_DMA_BLOCK_TIME));
dma_close(session_.transmit_dma);
i2s_transmit_set_enable(session_.transmit, 0);
}

View File

@ -30,7 +30,7 @@
using namespace sys;
#define SPI_TRANSMISSION_THRESHOLD 0x800UL
#define SPI_TRANSMISSION_THRESHOLD 0x0UL
#define SPI_DMA_BLOCK_TIME 1000UL
/* SPI Controller */

0
lib/bsp/entry_user.c Normal file → Executable file
View File

0
lib/freertos/conf/FreeRTOSConfig.h Normal file → Executable file
View File

View File

@ -120,6 +120,7 @@ void dma_transmit(handle_t file, const volatile void *src, volatile void *dest,
*/
void dma_loop_async(handle_t file, const volatile void **srcs, size_t src_num, volatile void **dests, size_t dest_num, bool src_inc, bool dest_inc, size_t element_size, size_t count, size_t burst_size, dma_stage_completion_handler_t stage_completion_handler, void *stage_completion_handler_data, SemaphoreHandle_t completion_event, int *stop_signal);
void dma_stop(handle_t file);
#ifdef __cplusplus
}
#endif

View File

@ -385,6 +385,7 @@ public:
virtual void config(uint32_t priority) = 0;
virtual void transmit_async(const volatile void *src, volatile void *dest, bool src_inc, bool dest_inc, size_t element_size, size_t count, size_t burst_size, SemaphoreHandle_t completion_event) = 0;
virtual void loop_async(const volatile void **srcs, size_t src_num, volatile void **dests, size_t dest_num, bool src_inc, bool dest_inc, size_t element_size, size_t count, size_t burst_size, dma_stage_completion_handler_t stage_completion_handler, void *stage_completion_handler_data, SemaphoreHandle_t completion_event, int *stop_signal) = 0;
virtual void stop() = 0;
};
class dmac_driver : public driver

View File

@ -951,6 +951,11 @@ void dma_loop_async(handle_t file, const volatile void **srcs, size_t src_num, v
dma->loop_async(srcs, src_num, dests, dest_num, src_inc, dest_inc, element_size, count, burst_size, stage_completion_handler, stage_completion_handler_data, completion_event, stop_signal);
}
void dma_stop(handle_t file)
{
COMMON_ENTRY(dma);
dma->stop();
}
/* System */
driver_registry_t *sys::system_install_driver(const char *name, object_ptr<driver> driver)