mirror of
https://github.com/kbeckmann/game-and-watch-retro-go.git
synced 2025-12-17 19:16:02 +01:00
134 lines
4.1 KiB
C
134 lines
4.1 KiB
C
#include "odroid_system.h"
|
|
#include "odroid_audio.h"
|
|
#include "common.h"
|
|
#include <assert.h>
|
|
|
|
#include "stm32h7xx_hal.h"
|
|
|
|
uint8_t audio_level = ODROID_AUDIO_VOLUME_MAX;
|
|
|
|
/* set audio frequency */
|
|
static void set_audio_frequency(uint32_t frequency)
|
|
{
|
|
|
|
/** reconfig PLL2 and SAI */
|
|
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
|
|
|
|
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SAI1;
|
|
|
|
/* Reconfigure on the fly PLL2 */
|
|
/* config to get 32768Hz */
|
|
/* The audio clock frequency is derived directly */
|
|
/* SAI mode is MCKDIV mode */
|
|
if (frequency == 32768)
|
|
{
|
|
|
|
PeriphClkInitStruct.PLL2.PLL2M = 25;
|
|
PeriphClkInitStruct.PLL2.PLL2N = 196;
|
|
PeriphClkInitStruct.PLL2.PLL2P = 10;
|
|
PeriphClkInitStruct.PLL2.PLL2Q = 2;
|
|
PeriphClkInitStruct.PLL2.PLL2R = 5;
|
|
PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
|
|
PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
|
|
PeriphClkInitStruct.PLL2.PLL2FRACN = 5000;
|
|
|
|
/* config to get 48KHz and multiple */
|
|
/* SAI mode is in standard frequency mode */
|
|
}
|
|
else
|
|
{
|
|
|
|
PeriphClkInitStruct.PLL2.PLL2M = 25;
|
|
PeriphClkInitStruct.PLL2.PLL2N = 192;
|
|
PeriphClkInitStruct.PLL2.PLL2P = 5;
|
|
PeriphClkInitStruct.PLL2.PLL2Q = 2;
|
|
PeriphClkInitStruct.PLL2.PLL2R = 5;
|
|
PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_1;
|
|
PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
|
|
PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
|
|
}
|
|
|
|
// keep PLL3 unchanged
|
|
PeriphClkInitStruct.PLL3.PLL3M = 4;
|
|
PeriphClkInitStruct.PLL3.PLL3N = 9;
|
|
PeriphClkInitStruct.PLL3.PLL3P = 2;
|
|
PeriphClkInitStruct.PLL3.PLL3Q = 2;
|
|
PeriphClkInitStruct.PLL3.PLL3R = 24;
|
|
PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_3;
|
|
PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
|
|
PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
|
|
|
|
PeriphClkInitStruct.Sai1ClockSelection = RCC_SAI1CLKSOURCE_PLL2;
|
|
PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
|
|
|
|
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
|
|
/* remove the current configuration */
|
|
HAL_SAI_DeInit(&hsai_BlockA1);
|
|
|
|
/* Set Audio sample rate at 32768Hz using MCKDIV mode */
|
|
if (frequency == 32768)
|
|
{
|
|
|
|
hsai_BlockA1.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_MCKDIV;
|
|
hsai_BlockA1.Init.Mckdiv = 6;
|
|
|
|
/* config to get 48KHz and other standard values */
|
|
/*
|
|
SAI_AUDIO_FREQUENCY_192K 192000U
|
|
SAI_AUDIO_FREQUENCY_96K 96000U
|
|
SAI_AUDIO_FREQUENCY_48K 48000U
|
|
SAI_AUDIO_FREQUENCY_44K 44100U
|
|
SAI_AUDIO_FREQUENCY_32K 32000U
|
|
SAI_AUDIO_FREQUENCY_22K 22050U
|
|
SAI_AUDIO_FREQUENCY_16K 16000U
|
|
SAI_AUDIO_FREQUENCY_11K 11025U
|
|
SAI_AUDIO_FREQUENCY_8K 8000U
|
|
*/
|
|
|
|
/* Set Audio sample rate at various standard frequencies using AudioFrequency mode */
|
|
} else {
|
|
/* default value 48KHz */
|
|
hsai_BlockA1.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_48K;
|
|
|
|
/* check from the different possible values */
|
|
if ((frequency == SAI_AUDIO_FREQUENCY_192K) ||
|
|
(frequency == SAI_AUDIO_FREQUENCY_96K) ||
|
|
(frequency == SAI_AUDIO_FREQUENCY_48K) ||
|
|
(frequency == SAI_AUDIO_FREQUENCY_44K) ||
|
|
(frequency == SAI_AUDIO_FREQUENCY_32K) ||
|
|
(frequency == SAI_AUDIO_FREQUENCY_22K) ||
|
|
(frequency == SAI_AUDIO_FREQUENCY_16K) ||
|
|
(frequency == SAI_AUDIO_FREQUENCY_11K) ||
|
|
(frequency == SAI_AUDIO_FREQUENCY_8K))
|
|
hsai_BlockA1.Init.AudioFrequency = frequency;
|
|
}
|
|
|
|
/* apply the new configuration */
|
|
HAL_SAI_Init(&hsai_BlockA1);
|
|
}
|
|
|
|
void odroid_audio_init(int sample_rate)
|
|
{
|
|
set_audio_frequency(sample_rate);
|
|
audio_level = odroid_settings_Volume_get();
|
|
}
|
|
|
|
void odroid_audio_submit(short* stereoAudioBuffer, int frameCount)
|
|
{
|
|
}
|
|
|
|
void odroid_audio_volume_set(int level)
|
|
{
|
|
audio_level = level;
|
|
odroid_settings_Volume_set(audio_level);
|
|
}
|
|
|
|
int odroid_audio_volume_get()
|
|
{
|
|
return audio_level;
|
|
}
|