Skip to content

Commit

Permalink
DMA Running
Browse files Browse the repository at this point in the history
  • Loading branch information
sreckamp committed Feb 1, 2024
1 parent 14fe364 commit 007b2d2
Show file tree
Hide file tree
Showing 12 changed files with 142 additions and 155 deletions.
50 changes: 0 additions & 50 deletions benchmark/interface/Application/Audio/HeadphoneWaveSink.cpp
Original file line number Diff line number Diff line change
@@ -1,51 +1,12 @@
#include "HeadphoneWaveSink.hpp"

#include "stm32h573i_discovery_audio.h"
#include "tx_semaphore.h"

static INT active_buffer = -1;
static TX_SEMAPHORE buffer_semaphore;

/**
* @brief Tx Transfer completed callbacks.
* @param hsai : pointer to a SAI_HandleTypeDef structure that contains
* the configuration information for SAI module.
* @retval None
*/
void BSP_AUDIO_OUT_TransferComplete_CallBack(uint32_t instance)
{
if(instance == 0)
{
active_buffer = 1;
tx_semaphore_ceiling_put(&buffer_semaphore, 1);
}
}

/**
* @brief Tx Transfer Half completed callbacks
* @param hsai : pointer to a SAI_HandleTypeDef structure that contains
* the configuration information for SAI module.
* @retval None
*/
void BSP_AUDIO_OUT_HalfTransfer_CallBack(uint32_t instance)
{
if(instance == 0)
{
active_buffer = 0;
tx_semaphore_ceiling_put(&buffer_semaphore, 1);
}
}

namespace Audio
{
HeadphoneWaveSink::HeadphoneWaveSink(Tasks::TaskRunner &runner, TX_BYTE_POOL &byte_pool)
: WaveSink(runner, byte_pool)
{
if(buffer_semaphore.tx_semaphore_id != TX_SEMAPHORE_ID)
{
const char *name = "Headphone buffer playback semaphore";
tx_semaphore_create(&buffer_semaphore, (char *)name, 0);
}
}

PlayerState HeadphoneWaveSink::GetState()
Expand Down Expand Up @@ -86,15 +47,4 @@ namespace Audio
{
return BSP_AUDIO_OUT_Stop(0) == BSP_ERROR_NONE ? SUCCESS : ERROR;
}

INT HeadphoneWaveSink::WaitForActiveBuffer()
{
while(active_buffer == -1) tx_semaphore_get(&buffer_semaphore, 50);
return active_buffer;
}

void HeadphoneWaveSink::SetActiveBuffer(INT buffer_id)
{
active_buffer = buffer_id;
}
}
2 changes: 0 additions & 2 deletions benchmark/interface/Application/Audio/HeadphoneWaveSink.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ namespace Audio
PlayerState Initialize();
PlayerResult Play(UCHAR *buffer, ULONG size);
PlayerResult Stop();
INT WaitForActiveBuffer();
void SetActiveBuffer(INT buffer_id);
};
}

Expand Down
51 changes: 1 addition & 50 deletions benchmark/interface/Application/Audio/RawI2SWaveSink.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,49 +8,11 @@

extern DMA_QListTypeDef RawSAIQueue;

static INT active_buffer = -1;
static TX_SEMAPHORE buffer_semaphore;

/**
* @brief Tx Transfer completed callbacks.
* @param hsai : pointer to a SAI_HandleTypeDef structure that contains
* the configuration information for SAI module.
* @retval None
*/
void HAL_SAI_TxCpltCallback(SAI_HandleTypeDef *hsai)
{
if(hsai == &hsai_BlockB1)
{
active_buffer = 1;
tx_semaphore_ceiling_put(&buffer_semaphore, 1);
}
}

/**
* @brief Tx Transfer Half completed callbacks
* @param hsai : pointer to a SAI_HandleTypeDef structure that contains
* the configuration information for SAI module.
* @retval None
*/
void HAL_SAI_TxHalfCpltCallback(SAI_HandleTypeDef *hsai)
{
if(hsai == &hsai_BlockB1)
{
active_buffer = 0;
tx_semaphore_ceiling_put(&buffer_semaphore, 1);
}
}

namespace Audio
{
RawI2SWaveSink::RawI2SWaveSink(Tasks::TaskRunner &runner, TX_BYTE_POOL &byte_pool)
: WaveSink(runner, byte_pool), state(RESET)
{
if(buffer_semaphore.tx_semaphore_id != TX_SEMAPHORE_ID)
{
const char *name = "Raw I2S buffer playback semaphore";
tx_semaphore_create(&buffer_semaphore, (char *)name, 0);
}
}

PlayerState RawI2SWaveSink::GetState()
Expand All @@ -60,7 +22,7 @@ namespace Audio

PlayerState RawI2SWaveSink::Initialize()
{
__HAL_LINKDMA(&hsai_BlockB1, hdmatx, handle_GPDMA1_Channel7);
__HAL_LINKDMA(&hsai_BlockB1, hdmatx, handle_GPDMA2_Channel2);
MX_RawSAIQueue_Config();
HAL_DMAEx_List_SetCircularMode(&RawSAIQueue);

Expand Down Expand Up @@ -96,15 +58,4 @@ namespace Audio
}
return ERROR;
}

INT RawI2SWaveSink::WaitForActiveBuffer()
{
while(active_buffer == -1) tx_semaphore_get(&buffer_semaphore, 50);
return active_buffer;
}

void RawI2SWaveSink::SetActiveBuffer(INT buffer_id)
{
active_buffer = buffer_id;
}
}
2 changes: 0 additions & 2 deletions benchmark/interface/Application/Audio/RawI2SWaveSink.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ namespace Audio
PlayerState Initialize();
PlayerResult Play(UCHAR *buffer, ULONG size);
PlayerResult Stop();
INT WaitForActiveBuffer();
void SetActiveBuffer(INT buffer_id);
private:
PlayerState state;
};
Expand Down
54 changes: 47 additions & 7 deletions benchmark/interface/Application/Audio/WaveSink.cpp
Original file line number Diff line number Diff line change
@@ -1,16 +1,49 @@
#include "WaveSink.hpp"
#include "../Tasks/ITask.hpp"

#include "tx_semaphore.h"

#define PLAY_BUFFER_BYTES 8 * 1024

/**
* @brief Tx Transfer completed callbacks.
* @param hsai : pointer to a SAI_HandleTypeDef structure that contains
* the configuration information for SAI module.
* @retval None
*/
void BSP_AUDIO_OUT_TransferComplete_CallBack(uint32_t instance)
{
if(instance == 0)
{
Audio::WaveSink::active_buffer = 1;
tx_semaphore_ceiling_put(&Audio::WaveSink::buffer_semaphore, 1);
}
}

/**
* @brief Tx Transfer Half completed callbacks
* @param hsai : pointer to a SAI_HandleTypeDef structure that contains
* the configuration information for SAI module.
* @retval None
*/
void BSP_AUDIO_OUT_HalfTransfer_CallBack(uint32_t instance)
{
if(instance == 0)
{
Audio::WaveSink::active_buffer = 0;
tx_semaphore_ceiling_put(&Audio::WaveSink::buffer_semaphore, 1);
}
}

namespace Audio
{
class PlayWaveTask: public Tasks::ITask
{
public:
PlayWaveTask(WaveSink &player, WaveSource &source):
ITask(TX_FALSE), player(player), source(source)
{ }
{
}

void Run()
{
Expand All @@ -28,8 +61,16 @@ namespace Audio
PlayerResult result;
};

INT WaveSink::active_buffer = -1;
TX_SEMAPHORE WaveSink::buffer_semaphore;

WaveSink::WaveSink(Tasks::TaskRunner &runner, TX_BYTE_POOL &byte_pool): runner(runner), size(PLAY_BUFFER_BYTES)
{
if(buffer_semaphore.tx_semaphore_id != TX_SEMAPHORE_ID)
{
const char *name = "SAI buffer playback semaphore";
tx_semaphore_create(&buffer_semaphore, (char *)name, 0);
}
tx_byte_allocate(&byte_pool, (void **)&play_buffer, size, TX_NO_WAIT);
}

Expand Down Expand Up @@ -59,19 +100,18 @@ namespace Audio
Configure(source);
source.Seek(0);

INT active_buffer = 0;
ULONG next_bytes = source.ReadData(play_buffer, size);
SetActiveBuffer(-1);
active_buffer = -1;

PlayerResult status = Play((UCHAR *)play_buffer, size);

while(status == SUCCESS && next_bytes > 0)
{
active_buffer = WaitForActiveBuffer();

next_bytes = source.ReadData(&play_buffer[active_buffer * size/2], size / 2);
while(active_buffer == -1) tx_semaphore_get(&buffer_semaphore, 50);
INT buffer_idx = active_buffer;
active_buffer = -1;

SetActiveBuffer(-1);
next_bytes = source.ReadData(&play_buffer[buffer_idx * size/2], size / 2);
}
Stop();
source.Close();
Expand Down
12 changes: 10 additions & 2 deletions benchmark/interface/Application/Audio/WaveSink.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@
#include "WaveSource.hpp"
#include "../Tasks/TaskRunner.hpp"

extern "C"
{
void BSP_AUDIO_OUT_TransferComplete_CallBack(uint32_t);
void BSP_AUDIO_OUT_HalfTransfer_CallBack(uint32_t);
};

namespace Audio
{
typedef enum
Expand Down Expand Up @@ -34,9 +40,11 @@ namespace Audio
virtual PlayerState Initialize() = 0;
virtual PlayerResult Play(UCHAR *buffer, ULONG size) = 0;
virtual PlayerResult Stop() = 0;
virtual INT WaitForActiveBuffer() = 0;
virtual void SetActiveBuffer(INT buffer_id) = 0;
private:
friend void ::BSP_AUDIO_OUT_TransferComplete_CallBack(uint32_t);
friend void ::BSP_AUDIO_OUT_HalfTransfer_CallBack(uint32_t);
static INT active_buffer;
static TX_SEMAPHORE buffer_semaphore;
Tasks::TaskRunner &runner;
UCHAR *play_buffer;
ULONG size;
Expand Down
5 changes: 3 additions & 2 deletions benchmark/interface/Core/Inc/gpdma.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,16 @@ extern "C" {

/* USER CODE END Includes */

extern DMA_HandleTypeDef handle_GPDMA1_Channel7;

extern DMA_HandleTypeDef handle_GPDMA1_Channel2;

extern DMA_HandleTypeDef handle_GPDMA2_Channel2;

/* USER CODE BEGIN Private defines */

/* USER CODE END Private defines */

void MX_GPDMA1_Init(void);
void MX_GPDMA2_Init(void);

/* USER CODE BEGIN Prototypes */

Expand Down
1 change: 1 addition & 0 deletions benchmark/interface/Core/Inc/stm32h5xx_it.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ void TIM6_IRQHandler(void);
void USART1_IRQHandler(void);
void USART3_IRQHandler(void);
void SDMMC1_IRQHandler(void);
void GPDMA2_Channel2_IRQHandler(void);
/* USER CODE BEGIN EFP */

/* USER CODE END EFP */
Expand Down
53 changes: 38 additions & 15 deletions benchmark/interface/Core/Src/gpdma.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@

/* USER CODE END 0 */

DMA_HandleTypeDef handle_GPDMA1_Channel7;
DMA_HandleTypeDef handle_GPDMA1_Channel2;
DMA_HandleTypeDef handle_GPDMA2_Channel2;

/* GPDMA1 init function */
void MX_GPDMA1_Init(void)
Expand All @@ -45,20 +45,6 @@ void MX_GPDMA1_Init(void)
/* USER CODE BEGIN GPDMA1_Init 1 */

/* USER CODE END GPDMA1_Init 1 */
handle_GPDMA1_Channel7.Instance = GPDMA1_Channel7;
handle_GPDMA1_Channel7.InitLinkedList.Priority = DMA_HIGH_PRIORITY;
handle_GPDMA1_Channel7.InitLinkedList.LinkStepMode = DMA_LSM_FULL_EXECUTION;
handle_GPDMA1_Channel7.InitLinkedList.LinkAllocatedPort = DMA_LINK_ALLOCATED_PORT0;
handle_GPDMA1_Channel7.InitLinkedList.TransferEventMode = DMA_TCEM_LAST_LL_ITEM_TRANSFER;
handle_GPDMA1_Channel7.InitLinkedList.LinkedListMode = DMA_LINKEDLIST_CIRCULAR;
if (HAL_DMAEx_List_Init(&handle_GPDMA1_Channel7) != HAL_OK)
{
Error_Handler();
}
if (HAL_DMA_ConfigChannelAttributes(&handle_GPDMA1_Channel7, DMA_CHANNEL_NPRIV) != HAL_OK)
{
Error_Handler();
}
handle_GPDMA1_Channel2.Instance = GPDMA1_Channel2;
handle_GPDMA1_Channel2.InitLinkedList.Priority = DMA_HIGH_PRIORITY;
handle_GPDMA1_Channel2.InitLinkedList.LinkStepMode = DMA_LSM_FULL_EXECUTION;
Expand All @@ -77,6 +63,43 @@ void MX_GPDMA1_Init(void)

/* USER CODE END GPDMA1_Init 2 */

}
/* GPDMA2 init function */
void MX_GPDMA2_Init(void)
{

/* USER CODE BEGIN GPDMA2_Init 0 */

/* USER CODE END GPDMA2_Init 0 */

/* Peripheral clock enable */
__HAL_RCC_GPDMA2_CLK_ENABLE();

/* GPDMA2 interrupt Init */
HAL_NVIC_SetPriority(GPDMA2_Channel2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(GPDMA2_Channel2_IRQn);

/* USER CODE BEGIN GPDMA2_Init 1 */

/* USER CODE END GPDMA2_Init 1 */
handle_GPDMA2_Channel2.Instance = GPDMA2_Channel2;
handle_GPDMA2_Channel2.InitLinkedList.Priority = DMA_HIGH_PRIORITY;
handle_GPDMA2_Channel2.InitLinkedList.LinkStepMode = DMA_LSM_FULL_EXECUTION;
handle_GPDMA2_Channel2.InitLinkedList.LinkAllocatedPort = DMA_LINK_ALLOCATED_PORT0;
handle_GPDMA2_Channel2.InitLinkedList.TransferEventMode = DMA_TCEM_LAST_LL_ITEM_TRANSFER;
handle_GPDMA2_Channel2.InitLinkedList.LinkedListMode = DMA_LINKEDLIST_CIRCULAR;
if (HAL_DMAEx_List_Init(&handle_GPDMA2_Channel2) != HAL_OK)
{
Error_Handler();
}
if (HAL_DMA_ConfigChannelAttributes(&handle_GPDMA2_Channel2, DMA_CHANNEL_NPRIV) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN GPDMA2_Init 2 */

/* USER CODE END GPDMA2_Init 2 */

}

/* USER CODE BEGIN 1 */
Expand Down
3 changes: 2 additions & 1 deletion benchmark/interface/Core/Src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ int main(void)
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_GPDMA1_Init();
MX_ADC2_Init();
MX_GPDMA2_Init();
MX_ETH_Init();
MX_FMC_Init();
MX_ICACHE_Init();
Expand All @@ -110,6 +110,7 @@ int main(void)
MX_USART1_UART_Init();
MX_USART3_UART_Init();
MX_ADC1_Init();
MX_ADC2_Init();
MX_SAI1_Init();
/* USER CODE BEGIN 2 */

Expand Down
Loading

0 comments on commit 007b2d2

Please sign in to comment.