SPI is configured as DMA mode by default;Fix i2s_stop
parent
60852bdbcb
commit
2eee33c274
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"files.associations": {
|
||||
"fft_soft.h": "c",
|
||||
"devices.h": "c"
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue