mirror of
https://github.com/openmv/openmv.git
synced 2025-09-26 23:09:13 +08:00
modules/py_audio: Add support for MDF.
This commit is contained in:
parent
2359a5c6d4
commit
deba7c05a6
@ -47,21 +47,38 @@
|
|||||||
static CRC_HandleTypeDef hcrc;
|
static CRC_HandleTypeDef hcrc;
|
||||||
static SAI_HandleTypeDef hsai;
|
static SAI_HandleTypeDef hsai;
|
||||||
static DMA_HandleTypeDef hdma_sai_rx;
|
static DMA_HandleTypeDef hdma_sai_rx;
|
||||||
|
|
||||||
static PDM_Filter_Config_t PDM_FilterConfig[OMV_AUDIO_MAX_CHANNELS];
|
static PDM_Filter_Config_t PDM_FilterConfig[OMV_AUDIO_MAX_CHANNELS];
|
||||||
static PDM_Filter_Handler_t PDM_FilterHandler[OMV_AUDIO_MAX_CHANNELS];
|
static PDM_Filter_Handler_t PDM_FilterHandler[OMV_AUDIO_MAX_CHANNELS];
|
||||||
// NOTE: BDMA can only access D3 SRAM4 memory.
|
// NOTE: BDMA can only access D3 SRAM4 memory.
|
||||||
#define PDM_BUFFER_SIZE (16384)
|
#define PDM_BUFFER_SIZE (16384)
|
||||||
uint8_t OMV_ATTR_SECTION(OMV_ATTR_ALIGNED(PDM_BUFFER[PDM_BUFFER_SIZE], 32), ".d3_dma_buffer");
|
uint8_t OMV_ATTR_SECTION(OMV_ATTR_ALIGNED(PDM_BUFFER[PDM_BUFFER_SIZE], 32), ".d3_dma_buffer");
|
||||||
|
|
||||||
#elif defined(OMV_DFSDM)
|
#elif defined(OMV_DFSDM)
|
||||||
static DFSDM_Channel_HandleTypeDef hdfsdm;
|
static DFSDM_Channel_HandleTypeDef hdfsdm;
|
||||||
|
|
||||||
// NOTE: Only 1 filter is supported right now.
|
// NOTE: Only 1 filter is supported right now.
|
||||||
static DFSDM_Filter_HandleTypeDef hdfsdm_filter[OMV_AUDIO_MAX_CHANNELS];
|
static DFSDM_Filter_HandleTypeDef hdfsdm_filter[OMV_AUDIO_MAX_CHANNELS];
|
||||||
static DMA_HandleTypeDef hdma_filter[OMV_AUDIO_MAX_CHANNELS];
|
static DMA_HandleTypeDef hdma_filter[OMV_AUDIO_MAX_CHANNELS];
|
||||||
|
|
||||||
// NOTE: placed in D2 memory.
|
// NOTE: placed in D2 memory.
|
||||||
#define PDM_BUFFER_SIZE (512 * 2)
|
#define PDM_BUFFER_SIZE (512 * 2)
|
||||||
int32_t OMV_ATTR_SECTION(OMV_ATTR_ALIGNED(PDM_BUFFER[PDM_BUFFER_SIZE], 32), ".d2_dma_buffer");
|
int32_t OMV_ATTR_SECTION(OMV_ATTR_ALIGNED(PDM_BUFFER[PDM_BUFFER_SIZE], 32), ".d2_dma_buffer");
|
||||||
|
|
||||||
#define DFSDM_GAIN_FRAC_BITS (3)
|
#define DFSDM_GAIN_FRAC_BITS (3)
|
||||||
static int32_t dfsdm_gain = 1;
|
static int32_t dfsdm_gain = 1;
|
||||||
|
|
||||||
|
#elif defined(OMV_MDF)
|
||||||
|
static MDF_HandleTypeDef hmdf;
|
||||||
|
static MDF_FilterConfigTypeDef hmdf_filter[OMV_AUDIO_MAX_CHANNELS];
|
||||||
|
|
||||||
|
// NOTE: Only 1 filter is supported right now.
|
||||||
|
static DMA_QListTypeDef hdma_queue;
|
||||||
|
static DMA_NodeTypeDef OMV_ATTR_SECTION(OMV_ATTR_ALIGNED(hdma_node, 32), ".dma_buffer");
|
||||||
|
static DMA_HandleTypeDef hdma_filter[OMV_AUDIO_MAX_CHANNELS];
|
||||||
|
|
||||||
|
#define PDM_BUFFER_SIZE (512 * 2)
|
||||||
|
int32_t OMV_ATTR_SECTION(OMV_ATTR_ALIGNED(PDM_BUFFER[PDM_BUFFER_SIZE], 32), ".dma_buffer");
|
||||||
#else
|
#else
|
||||||
#error "No audio driver defined for this board"
|
#error "No audio driver defined for this board"
|
||||||
#endif
|
#endif
|
||||||
@ -84,20 +101,24 @@ void OMV_SAI_DMA_IRQHandler(void) {
|
|||||||
HAL_DMA_IRQHandler(hsai.hdmarx);
|
HAL_DMA_IRQHandler(hsai.hdmarx);
|
||||||
}
|
}
|
||||||
#elif defined(OMV_DFSDM)
|
#elif defined(OMV_DFSDM)
|
||||||
void OMV_DFSDM_FLT0_IRQHandler() {
|
void OMV_DFSDM_FLT0_IRQHandler(void) {
|
||||||
HAL_DFSDM_IRQHandler(&hdfsdm_filter[0]);
|
HAL_DFSDM_IRQHandler(&hdfsdm_filter[0]);
|
||||||
}
|
}
|
||||||
|
#elif defined(OMV_MDF)
|
||||||
|
void OMV_MDF_FLT0_IRQHandler(void) {
|
||||||
|
HAL_MDF_IRQHandler(&hmdf);
|
||||||
|
}
|
||||||
#endif // defined(OMV_SAI)
|
#endif // defined(OMV_SAI)
|
||||||
|
|
||||||
#if defined(OMV_SAI)
|
#if defined(OMV_SAI)
|
||||||
void HAL_SAI_RxHalfCpltCallback(SAI_HandleTypeDef *hsai)
|
void HAL_SAI_RxHalfCpltCallback(SAI_HandleTypeDef *hsai)
|
||||||
#elif defined(OMV_DFSDM)
|
#elif defined(OMV_DFSDM)
|
||||||
void HAL_DFSDM_FilterRegConvHalfCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)
|
void HAL_DFSDM_FilterRegConvHalfCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)
|
||||||
|
#elif defined(OMV_MDF)
|
||||||
|
void HAL_MDF_AcqHalfCpltCallback(MDF_HandleTypeDef *hmdf)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
xfer_status |= DMA_XFER_HALF;
|
xfer_status |= DMA_XFER_HALF;
|
||||||
uint32_t pdm_buffer_size_bytes = (sizeof(PDM_BUFFER[0]) * g_pdm_buffer_size);
|
|
||||||
SCB_InvalidateDCache_by_Addr((uint32_t *) (&PDM_BUFFER[0]), pdm_buffer_size_bytes);
|
|
||||||
if (MP_STATE_PORT(audio_callback) != mp_const_none) {
|
if (MP_STATE_PORT(audio_callback) != mp_const_none) {
|
||||||
mp_sched_schedule_node(&audio_task_sched_node, audio_task_callback);
|
mp_sched_schedule_node(&audio_task_sched_node, audio_task_callback);
|
||||||
}
|
}
|
||||||
@ -107,11 +128,11 @@ void HAL_DFSDM_FilterRegConvHalfCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_
|
|||||||
void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)
|
void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai)
|
||||||
#elif defined(OMV_DFSDM)
|
#elif defined(OMV_DFSDM)
|
||||||
void HAL_DFSDM_FilterRegConvCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)
|
void HAL_DFSDM_FilterRegConvCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)
|
||||||
|
#elif defined(OMV_MDF)
|
||||||
|
void HAL_MDF_AcqCpltCallback(MDF_HandleTypeDef *hmdf)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
xfer_status |= DMA_XFER_FULL;
|
xfer_status |= DMA_XFER_FULL;
|
||||||
uint32_t pdm_buffer_size_bytes = (sizeof(PDM_BUFFER[0]) * g_pdm_buffer_size);
|
|
||||||
SCB_InvalidateDCache_by_Addr((uint32_t *) (&PDM_BUFFER[g_pdm_buffer_size]), pdm_buffer_size_bytes / 2);
|
|
||||||
if (MP_STATE_PORT(audio_callback) != mp_const_none) {
|
if (MP_STATE_PORT(audio_callback) != mp_const_none) {
|
||||||
mp_sched_schedule_node(&audio_task_sched_node, audio_task_callback);
|
mp_sched_schedule_node(&audio_task_sched_node, audio_task_callback);
|
||||||
}
|
}
|
||||||
@ -166,7 +187,9 @@ static mp_obj_t py_audio_init(uint n_args, const mp_obj_t *pos_args, mp_map_t *k
|
|||||||
// Default/max PDM buffer size;
|
// Default/max PDM buffer size;
|
||||||
g_pdm_buffer_size = PDM_BUFFER_SIZE;
|
g_pdm_buffer_size = PDM_BUFFER_SIZE;
|
||||||
|
|
||||||
#if defined(OMV_DFSDM)
|
#if defined(OMV_MDF)
|
||||||
|
uint32_t samples_per_channel = PDM_BUFFER_SIZE / 2; // Half a transfer
|
||||||
|
#elif defined(OMV_DFSDM)
|
||||||
uint32_t samples_per_channel = PDM_BUFFER_SIZE / 2; // Half a transfer
|
uint32_t samples_per_channel = PDM_BUFFER_SIZE / 2; // Half a transfer
|
||||||
dfsdm_gain = __USAT(fast_roundf(expf((gain_db / 20.0f) * M_LN10) * (1 << DFSDM_GAIN_FRAC_BITS)), 15);
|
dfsdm_gain = __USAT(fast_roundf(expf((gain_db / 20.0f) * M_LN10) * (1 << DFSDM_GAIN_FRAC_BITS)), 15);
|
||||||
#else
|
#else
|
||||||
@ -189,7 +212,7 @@ static mp_obj_t py_audio_init(uint n_args, const mp_obj_t *pos_args, mp_map_t *k
|
|||||||
}
|
}
|
||||||
samples_per_channel = args[ARG_samples].u_int;
|
samples_per_channel = args[ARG_samples].u_int;
|
||||||
// Recalculate the PDM buffer size for the requested samples.
|
// Recalculate the PDM buffer size for the requested samples.
|
||||||
#if defined(OMV_DFSDM)
|
#if defined(OMV_DFSDM) || defined(OMV_MDF)
|
||||||
g_pdm_buffer_size = samples_per_channel * 2;
|
g_pdm_buffer_size = samples_per_channel * 2;
|
||||||
#else
|
#else
|
||||||
g_pdm_buffer_size = (samples_per_channel * decimation_factor * g_channels) / 4;
|
g_pdm_buffer_size = (samples_per_channel * decimation_factor * g_channels) / 4;
|
||||||
@ -369,6 +392,96 @@ static mp_obj_t py_audio_init(uint n_args, const mp_obj_t *pos_args, mp_map_t *k
|
|||||||
|
|
||||||
NVIC_SetPriority(OMV_DFSDM_FLT0_IRQ, IRQ_PRI_DMA21);
|
NVIC_SetPriority(OMV_DFSDM_FLT0_IRQ, IRQ_PRI_DMA21);
|
||||||
HAL_NVIC_EnableIRQ(OMV_DFSDM_FLT0_IRQ);
|
HAL_NVIC_EnableIRQ(OMV_DFSDM_FLT0_IRQ);
|
||||||
|
#elif defined(OMV_MDF)
|
||||||
|
hmdf.Instance = OMV_MDF;
|
||||||
|
hmdf.Init.CommonParam.InterleavedFilters = 0;
|
||||||
|
hmdf.Init.CommonParam.ProcClockDivider = OMV_MDF_PROC_CLKDIV;
|
||||||
|
hmdf.Init.CommonParam.OutputClock.Activation = ENABLE;
|
||||||
|
hmdf.Init.CommonParam.OutputClock.Pins = MDF_OUTPUT_CLOCK_0;
|
||||||
|
hmdf.Init.CommonParam.OutputClock.Divider = OMV_MDF_CCKY_CLKDIV;
|
||||||
|
hmdf.Init.CommonParam.OutputClock.Trigger.Activation = DISABLE;
|
||||||
|
hmdf.Init.SerialInterface.Activation = ENABLE;
|
||||||
|
hmdf.Init.SerialInterface.Mode = MDF_SITF_LF_MASTER_SPI_MODE;
|
||||||
|
hmdf.Init.SerialInterface.ClockSource = MDF_SITF_CCK0_SOURCE;
|
||||||
|
hmdf.Init.SerialInterface.Threshold = 31;
|
||||||
|
hmdf.Init.FilterBistream = MDF_BITSTREAM0_FALLING;
|
||||||
|
if (HAL_MDF_Init(&hmdf) != HAL_OK) {
|
||||||
|
RAISE_OS_EXCEPTION("MDF init failed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
hmdf_filter[0].DataSource = MDF_DATA_SOURCE_BSMX;
|
||||||
|
hmdf_filter[0].Delay = 0;
|
||||||
|
hmdf_filter[0].CicMode = MDF_ONE_FILTER_SINC4;
|
||||||
|
hmdf_filter[0].DecimationRatio = 32;
|
||||||
|
hmdf_filter[0].Offset = 0;
|
||||||
|
hmdf_filter[0].Gain = gain_db / 3; // gain in steps of 3db
|
||||||
|
hmdf_filter[0].ReshapeFilter.Activation = ENABLE;
|
||||||
|
hmdf_filter[0].ReshapeFilter.DecimationRatio = MDF_RSF_DECIMATION_RATIO_4;
|
||||||
|
hmdf_filter[0].HighPassFilter.Activation = DISABLE; // Disabled for now.
|
||||||
|
hmdf_filter[0].HighPassFilter.CutOffFrequency = MDF_HPF_CUTOFF_0_000625FPCM;
|
||||||
|
hmdf_filter[0].Integrator.Activation = DISABLE;
|
||||||
|
hmdf_filter[0].SoundActivity.Activation = DISABLE;
|
||||||
|
hmdf_filter[0].AcquisitionMode = MDF_MODE_ASYNC_CONT;
|
||||||
|
hmdf_filter[0].FifoThreshold = MDF_FIFO_THRESHOLD_NOT_EMPTY;
|
||||||
|
hmdf_filter[0].DiscardSamples = 0;
|
||||||
|
|
||||||
|
DMA_NodeConfTypeDef dma_ncfg;
|
||||||
|
|
||||||
|
dma_ncfg.NodeType = DMA_GPDMA_LINEAR_NODE;
|
||||||
|
dma_ncfg.Init.Mode = DMA_NORMAL;
|
||||||
|
dma_ncfg.Init.Request = OMV_MDF_FLT0_DMA_REQUEST;
|
||||||
|
dma_ncfg.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;
|
||||||
|
dma_ncfg.Init.Direction = DMA_PERIPH_TO_MEMORY;
|
||||||
|
dma_ncfg.Init.SrcInc = DMA_SINC_FIXED;
|
||||||
|
dma_ncfg.Init.DestInc = DMA_DINC_INCREMENTED;
|
||||||
|
dma_ncfg.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_WORD;
|
||||||
|
dma_ncfg.Init.DestDataWidth = DMA_DEST_DATAWIDTH_WORD;
|
||||||
|
dma_ncfg.Init.SrcBurstLength = 1;
|
||||||
|
dma_ncfg.Init.DestBurstLength = 1;
|
||||||
|
dma_ncfg.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0 | DMA_DEST_ALLOCATED_PORT1;
|
||||||
|
dma_ncfg.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
|
||||||
|
|
||||||
|
dma_ncfg.SrcSecure = DMA_CHANNEL_SRC_SEC;
|
||||||
|
dma_ncfg.DestSecure = DMA_CHANNEL_DEST_SEC;
|
||||||
|
dma_ncfg.DataHandlingConfig.DataExchange = DMA_EXCHANGE_NONE;
|
||||||
|
dma_ncfg.DataHandlingConfig.DataAlignment = DMA_DATA_RIGHTALIGN_ZEROPADDED;
|
||||||
|
dma_ncfg.TriggerConfig.TriggerPolarity = DMA_TRIG_POLARITY_MASKED;
|
||||||
|
|
||||||
|
if (HAL_DMAEx_List_BuildNode(&dma_ncfg, &hdma_node) != HAL_OK ||
|
||||||
|
HAL_DMAEx_List_InsertNode(&hdma_queue, NULL, &hdma_node) != HAL_OK ||
|
||||||
|
HAL_DMAEx_List_SetCircularMode(&hdma_queue) != HAL_OK) {
|
||||||
|
RAISE_OS_EXCEPTION("MDF DMA init failed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
hdma_filter[0].Instance = OMV_MDF_FLT0_DMA_STREAM;
|
||||||
|
hdma_filter[0].InitLinkedList.Priority = DMA_LOW_PRIORITY_LOW_WEIGHT;
|
||||||
|
hdma_filter[0].InitLinkedList.LinkStepMode = DMA_LSM_FULL_EXECUTION;
|
||||||
|
hdma_filter[0].InitLinkedList.LinkedListMode = DMA_LINKEDLIST_CIRCULAR;
|
||||||
|
hdma_filter[0].InitLinkedList.LinkAllocatedPort = DMA_LINK_ALLOCATED_PORT0;
|
||||||
|
hdma_filter[0].InitLinkedList.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
|
||||||
|
|
||||||
|
if (HAL_DMAEx_List_Init(&hdma_filter[0]) != HAL_OK ||
|
||||||
|
HAL_DMAEx_List_LinkQ(&hdma_filter[0], &hdma_queue) != HAL_OK) {
|
||||||
|
RAISE_OS_EXCEPTION("MDF DMA init failed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
__HAL_LINKDMA(&hmdf, hdma, hdma_filter[0]);
|
||||||
|
|
||||||
|
if (HAL_DMA_ConfigChannelAttributes(&hdma_filter[0],
|
||||||
|
DMA_CHANNEL_PRIV | DMA_CHANNEL_SEC |
|
||||||
|
DMA_CHANNEL_SRC_SEC | DMA_CHANNEL_DEST_SEC) != HAL_OK) {
|
||||||
|
RAISE_OS_EXCEPTION("MDF DMA init failed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set DMA IRQ handle
|
||||||
|
dma_utils_set_irq_descr(OMV_MDF_FLT0_DMA_STREAM, &hdma_filter[0]);
|
||||||
|
|
||||||
|
// Configure and enable MDF Filter 0 DMA IRQ.
|
||||||
|
NVIC_SetPriority(OMV_MDF_FLT0_IRQ, IRQ_PRI_DMA21);
|
||||||
|
HAL_NVIC_EnableIRQ(OMV_MDF_FLT0_IRQ);
|
||||||
|
|
||||||
|
NVIC_SetPriority(OMV_MDF_FLT0_DMA_IRQ, IRQ_PRI_DMA21);
|
||||||
|
HAL_NVIC_EnableIRQ(OMV_MDF_FLT0_DMA_IRQ);
|
||||||
#endif // defined(OMV_SAI)
|
#endif // defined(OMV_SAI)
|
||||||
|
|
||||||
// Allocate global PCM buffer.
|
// Allocate global PCM buffer.
|
||||||
@ -399,6 +512,15 @@ void py_audio_deinit() {
|
|||||||
HAL_DMA_DeInit(&hdma_sai_rx);
|
HAL_DMA_DeInit(&hdma_sai_rx);
|
||||||
hdma_sai_rx.Instance = NULL;
|
hdma_sai_rx.Instance = NULL;
|
||||||
}
|
}
|
||||||
|
#elif defined(OMV_MDF)
|
||||||
|
if (hmdf.Instance != NULL) {
|
||||||
|
HAL_MDF_AcqStop_DMA(&hmdf);
|
||||||
|
HAL_MDF_DeInit(&hmdf);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disable IRQs
|
||||||
|
HAL_NVIC_DisableIRQ(OMV_MDF_FLT0_IRQ);
|
||||||
|
HAL_NVIC_DisableIRQ(OMV_MDF_FLT0_DMA_IRQ);
|
||||||
#elif defined(OMV_DFSDM)
|
#elif defined(OMV_DFSDM)
|
||||||
if (hdma_filter[0].Instance != NULL) {
|
if (hdma_filter[0].Instance != NULL) {
|
||||||
HAL_DFSDM_FilterRegularStop_DMA(&hdfsdm_filter[0]);
|
HAL_DFSDM_FilterRegularStop_DMA(&hdfsdm_filter[0]);
|
||||||
@ -438,6 +560,10 @@ static void audio_task_callback(mp_sched_node_t *node) {
|
|||||||
for (int i = 0; i < g_channels; i++) {
|
for (int i = 0; i < g_channels; i++) {
|
||||||
PDM_Filter(&((uint8_t *) PDM_BUFFER)[i], &pcmbuf[i], &PDM_FilterHandler[i]);
|
PDM_Filter(&((uint8_t *) PDM_BUFFER)[i], &pcmbuf[i], &PDM_FilterHandler[i]);
|
||||||
}
|
}
|
||||||
|
#elif defined(OMV_MDF)
|
||||||
|
for (int i = 0; i < g_pdm_buffer_size / 2; i++) {
|
||||||
|
pcmbuf[i] = PDM_BUFFER[i] >> 16;
|
||||||
|
}
|
||||||
#elif defined(OMV_DFSDM)
|
#elif defined(OMV_DFSDM)
|
||||||
for (int i = 0; i < g_pdm_buffer_size / 2; i++) {
|
for (int i = 0; i < g_pdm_buffer_size / 2; i++) {
|
||||||
pcmbuf[i] = __SSAT_ASR((PDM_BUFFER[i] >> 8) * dfsdm_gain, 16, DFSDM_GAIN_FRAC_BITS);
|
pcmbuf[i] = __SSAT_ASR((PDM_BUFFER[i] >> 8) * dfsdm_gain, 16, DFSDM_GAIN_FRAC_BITS);
|
||||||
@ -453,6 +579,10 @@ static void audio_task_callback(mp_sched_node_t *node) {
|
|||||||
for (int i = 0; i < g_channels; i++) {
|
for (int i = 0; i < g_channels; i++) {
|
||||||
PDM_Filter(&((uint8_t *) PDM_BUFFER)[g_pdm_buffer_size / 2 + i], &pcmbuf[i], &PDM_FilterHandler[i]);
|
PDM_Filter(&((uint8_t *) PDM_BUFFER)[g_pdm_buffer_size / 2 + i], &pcmbuf[i], &PDM_FilterHandler[i]);
|
||||||
}
|
}
|
||||||
|
#elif defined(OMV_MDF)
|
||||||
|
for (int i = 0; i < g_pdm_buffer_size / 2; i++) {
|
||||||
|
pcmbuf[i] = PDM_BUFFER[g_pdm_buffer_size / 2 + i] >> 16;
|
||||||
|
}
|
||||||
#elif defined(OMV_DFSDM)
|
#elif defined(OMV_DFSDM)
|
||||||
for (int i = 0; i < g_pdm_buffer_size / 2; i++) {
|
for (int i = 0; i < g_pdm_buffer_size / 2; i++) {
|
||||||
pcmbuf[i] = __SSAT_ASR((PDM_BUFFER[g_pdm_buffer_size / 2 + i] >> 8) * dfsdm_gain, 16, DFSDM_GAIN_FRAC_BITS);
|
pcmbuf[i] = __SSAT_ASR((PDM_BUFFER[g_pdm_buffer_size / 2 + i] >> 8) * dfsdm_gain, 16, DFSDM_GAIN_FRAC_BITS);
|
||||||
@ -480,6 +610,15 @@ static mp_obj_t py_audio_start_streaming(mp_obj_t callback_obj) {
|
|||||||
MP_STATE_PORT(audio_callback) = mp_const_none;
|
MP_STATE_PORT(audio_callback) = mp_const_none;
|
||||||
RAISE_OS_EXCEPTION("SAI DMA transfer failed!");
|
RAISE_OS_EXCEPTION("SAI DMA transfer failed!");
|
||||||
}
|
}
|
||||||
|
#elif defined(OMV_MDF)
|
||||||
|
MDF_DmaConfigTypeDef dma_config = {
|
||||||
|
.Address = (uint32_t) PDM_BUFFER,
|
||||||
|
.DataLength = sizeof(PDM_BUFFER[0]) * g_pdm_buffer_size, // in bytes
|
||||||
|
.MsbOnly = DISABLE,
|
||||||
|
};
|
||||||
|
if (HAL_MDF_AcqStart_DMA(&hmdf, &hmdf_filter[0], &dma_config) != HAL_OK) {
|
||||||
|
RAISE_OS_EXCEPTION("MDF DMA transfer failed!");
|
||||||
|
}
|
||||||
#elif defined(OMV_DFSDM)
|
#elif defined(OMV_DFSDM)
|
||||||
// Start DMA transfer
|
// Start DMA transfer
|
||||||
if (HAL_DFSDM_FilterRegularStart_DMA(&hdfsdm_filter[0], PDM_BUFFER, g_pdm_buffer_size) != HAL_OK) {
|
if (HAL_DFSDM_FilterRegularStart_DMA(&hdfsdm_filter[0], PDM_BUFFER, g_pdm_buffer_size) != HAL_OK) {
|
||||||
|
Loading…
Reference in New Issue
Block a user