// // Created by xemon on 19.10.22. // #include "AudioCodec.h" #include #include #include 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; }