155 lines
4.2 KiB
C
155 lines
4.2 KiB
C
//
|
|
// Created by xemon on 19.10.22.
|
|
//
|
|
#include "AudioCodec.h"
|
|
#include <max9860_regs.h>
|
|
#include <AsciiStringAssmeblingUtils.h>
|
|
#include <AsciiStringParsingUtils.h>
|
|
|
|
bool AudioCodecInitInterface(tAudioCodec *env);
|
|
|
|
bool AudioCodecTurnOff(tAudioCodec *env);
|
|
|
|
bool AudioCodecTurnOn(tAudioCodec *env);
|
|
|
|
bool AudioCodecInvalidateSettings(tAudioCodec *env);
|
|
|
|
#define IF_NOT_OK_I2C_RETURN(VALUE) if(!VALUE) return false;
|
|
|
|
void AudioCodecInit(
|
|
tAudioCodec *env,
|
|
tI2cIO *codecIO,
|
|
MAX9860_ComplexAudioConfig *config
|
|
) {
|
|
env->codecIO = codecIO;
|
|
env->config = config;
|
|
}
|
|
|
|
bool AudioCodecEnable(tAudioCodec *env) {
|
|
// return true;
|
|
|
|
IF_NOT_OK_I2C_RETURN(AudioCodecTurnOff(env))
|
|
|
|
IF_NOT_OK_I2C_RETURN (AudioCodecInitInterface(env))
|
|
|
|
IF_NOT_OK_I2C_RETURN(AudioCodecInvalidateSettings(env))
|
|
|
|
IF_NOT_OK_I2C_RETURN(AudioCodecTurnOn(env))
|
|
|
|
// char asciiSettings[] = "00000000109E3F0400000633004A0000008A";
|
|
// char asciiSettings[] = "00109000040000048c20340000008a";
|
|
// uint8_t byteSettings[sizeof(asciiSettings) - 1 / 2];
|
|
// size_t dataLen = iAsciiStringParseHexBytes(byteSettings, asciiSettings, sizeof(asciiSettings) - 1);
|
|
// uint16_t res = I2cWrite(env->codecIO, MAX9860_ADDRESS_WRITE, byteSettings, dataLen, MAX9860_IO_TIMEOUT) == dataLen;
|
|
// return res;
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
bool AudioCodecTurnOff(tAudioCodec *env) {
|
|
MAX9860_PowerManagementState MAX9860_POWER = {
|
|
.FullPowerOn=false,
|
|
.DAC_Enabled=false,
|
|
.ADC_EnabledLeft=false,
|
|
.ADC_EnabledRight=false,
|
|
};
|
|
|
|
|
|
return xAudioCodecSetPowerManagement(env->codecIO, MAX9860_POWER);
|
|
}
|
|
|
|
bool AudioCodecTurnOn(tAudioCodec *env) {
|
|
MAX9860_PowerManagementState MAX9860_POWER = (MAX9860_PowerManagementState) {
|
|
.FullPowerOn=true,
|
|
.DAC_Enabled=true,
|
|
.ADC_EnabledLeft=true,
|
|
.ADC_EnabledRight=false,
|
|
};
|
|
|
|
|
|
return xAudioCodecSetPowerManagement(env->codecIO, MAX9860_POWER);
|
|
}
|
|
|
|
bool AudioCodecInitInterface(tAudioCodec *env) {
|
|
|
|
// IF_NOT_OK_I2C_RETURN(AudioCodecTurnOff(env))
|
|
|
|
|
|
// uint8_t AUD_SET[15];
|
|
// vConvertAsciiToBytes((unsigned char *) "031120000C0044063320200000D58A", 30, (char *) AUD_SET);
|
|
//// "03 - 11 2000 - 0C 00 - 44063320200000D58A"
|
|
//// I2cIOResult codecSetRes =
|
|
// env->audioCodecIO->write(0x20, AUD_SET, 15, 1000);
|
|
// vMainModesArbiterInitMax9860(env);
|
|
|
|
MAX9860_ClocksState MAX9860_CLOCK = {
|
|
.MCLK_TO_PCLK_Prescaler=MAX9860_PRESCALER_MCLK_10_TO_20_MHZ,
|
|
.IntegerClockMode=MAX9860_ICM_NORMAL,
|
|
.EXACTLY_16KHZ=false,
|
|
|
|
//LRCLK for mclk 12.288mhz
|
|
.PLL_Enable=true,
|
|
.LRCLK_Driver=0x1000,// 8khz
|
|
// .LRCLK_Driver=0x2000,//16khz
|
|
};
|
|
|
|
IF_NOT_OK_I2C_RETURN(xAudioCodecSetClock(env->codecIO, MAX9860_CLOCK))
|
|
|
|
MAX9860_AudioInterfaceState MAX9860_AUDIO_INTERFACE = {
|
|
.MasterMode = false,
|
|
.LRCLK_Invert = false,
|
|
.DAC_BCLK_Invert = true,
|
|
.DAC_DelayMode = false,
|
|
.SDOUT_HighImpedanceMode = false,
|
|
.TDM_ModeSelect = true,
|
|
|
|
.ADC_BCLK_Invert = false,
|
|
.ADC_Delay_Mode= false,
|
|
.StereoEnable= false,
|
|
.BCLK_Select= 0b000,
|
|
};
|
|
|
|
IF_NOT_OK_I2C_RETURN(xAudioCodecSetInterface(env->codecIO, MAX9860_AUDIO_INTERFACE))
|
|
|
|
return true;
|
|
}
|
|
|
|
bool AudioCodecInvalidateSettings(tAudioCodec *env) {
|
|
|
|
IF_NOT_OK_I2C_RETURN(
|
|
xAudioCodecSetDigitalFilters(
|
|
env->codecIO,
|
|
env->config->filters
|
|
)
|
|
)
|
|
|
|
IF_NOT_OK_I2C_RETURN(
|
|
xAudioCodecSetDigitalLevelControls(
|
|
env->codecIO,
|
|
env->config->levelControl
|
|
)
|
|
)
|
|
|
|
IF_NOT_OK_I2C_RETURN(
|
|
xAudioCodecSetMicrophoneInput(
|
|
env->codecIO,
|
|
env->config->microphoneGains
|
|
)
|
|
)
|
|
|
|
IF_NOT_OK_I2C_RETURN(
|
|
xAudioCodecSetAutomaticGainControlAndNoiseGate(
|
|
env->codecIO,
|
|
env->config->autoGainAndNoiseGate
|
|
)
|
|
)
|
|
|
|
return true;
|
|
}
|
|
|
|
bool AudioCodecTestStatus(tAudioCodec *env) {
|
|
uint8_t status[3];
|
|
uint8_t read = xAudioCodecReadStatus(env->codecIO, status);
|
|
return read;
|
|
} |