AudioCodec_MAX9860/Src/audio_codec.c

191 lines
6.5 KiB
C

//
// Created by zemon on 24.06.2021.
//
#include <memory.h>
#include "max9860.h"
#include "max9860_regs.h"
bool xAudioCodecSetClock(tI2cIO *i2c, MAX9860_ClocksState clocksState) {
uint8_t I2C_Out[4] = {0};
I2C_Out[0] = MAX9860_REG_SYSTEM_CLOCK;
I2C_Out[1] = 0x00 |
((clocksState.MCLK_TO_PCLK_Prescaler & 0b11) << 4) |
((clocksState.IntegerClockMode & 0b11) << 1) |
((clocksState.EXACTLY_16KHZ & 0b1) << 0);
I2C_Out[2] = 0x00 |
((clocksState.PLL_Enable & 0b1) << 7) |
(((uint8_t) (clocksState.LRCLK_Driver >> 8)) & 0b01111111);
I2C_Out[3] = ((uint8_t) (clocksState.LRCLK_Driver & 0xFF));
return I2cWrite(i2c, MAX9860_ADDRESS_WRITE, I2C_Out, 4, MAX9860_IO_TIMEOUT) == 4;
}
bool xAudioCodecSetInterface(tI2cIO *i2c, MAX9860_AudioInterfaceState interface) {
uint8_t I2C_Out[3] = {0};
I2C_Out[0] = MAX9860_REG_INTERFACE;
I2C_Out[1] = 0x00 |
((interface.MasterMode & 0b1) << 7) |
((interface.LRCLK_Invert & 0b1) << 6) |
((interface.DAC_BCLK_Invert & 0b1) << 5) |
((interface.DAC_DelayMode & 0b1) << 4) |
((interface.SDOUT_HighImpedanceMode & 0b1) << 3) |
((interface.TDM_ModeSelect & 0b1) << 2);
I2C_Out[2] = 0x00 |
((interface.ADC_BCLK_Invert & 0b1) << 5) |
((interface.ADC_Delay_Mode & 0b1) << 4) |
((interface.StereoEnable & 0b1) << 3) |
((interface.BCLK_Select & 0b111) << 0);
return I2cWrite(i2c, MAX9860_ADDRESS_WRITE, I2C_Out, 3, MAX9860_IO_TIMEOUT) == 3;
}
bool xAudioCodecSetDigitalFilters(tI2cIO *i2c, MAX9860_DigitalFiltersState filters) {
uint8_t I2C_Out[2] = {0};
I2C_Out[0] = MAX9860_REG_VOICE_FILTERING;
I2C_Out[1] = 0x00 |
((filters.ADC_DigitalFilter & 0b1111) << 4) |
((filters.DAC_DigitalFilter & 0b1111) << 0);
return I2cWrite(i2c, MAX9860_ADDRESS_WRITE, I2C_Out, 2, MAX9860_IO_TIMEOUT) == 2;
}
bool xAudioCodecSetDigitalLevelControls(tI2cIO *i2c, MAX9860_DigitalLevelControlState levels) {
uint8_t I2C_Out[4] = {0};
I2C_Out[0] = MAX9860_REG_DAC_ATTENUATION;
I2C_Out[1] = levels.DAC_LevelAdjust;
I2C_Out[2] = 0x00 |
((levels.ADC_OutputLevelRight & 0b1111) << 4) |
((levels.ADC_OutputLevelLeft & 0b1111) << 0);
I2C_Out[3] = 0x00 |
((levels.DAC_Gain & 0b11) << 5) |
((levels.Sidetone & 0b11111) << 0);
return I2cWrite(i2c, MAX9860_ADDRESS_WRITE, I2C_Out, 4, MAX9860_IO_TIMEOUT) == 4;
}
bool xAudioCodecSetMicrophoneInput(tI2cIO *i2c, MAX9860_MicrophoneInputState micro) {
uint8_t I2C_Out[2] = {0};
I2C_Out[0] = MAX9860_REG_MICROPHONE_GAIN;
I2C_Out[1] = 0x00 |
((micro.MicrophonePreampGain & 0b11) << 5) |
((micro.MicrophoneProgrammableGain & 0b11111) << 0);
return I2cWrite(i2c, MAX9860_ADDRESS_WRITE, I2C_Out, 2, MAX9860_IO_TIMEOUT) == 2;
}
bool xAudioCodecSetAutomaticGainControlAndNoiseGate(
tI2cIO *i2c,
MAX9860_AutomaticGainControlAndNoiseGateState values
) {
uint8_t I2C_Out[3] = {0};
I2C_Out[0] = MAX9860_REG_MICROPHONE_AGC;
I2C_Out[1] = 0x00 |
((values.NoiseGateSource & 0b1) << 7) |
((values.ReleaseTime & 0b111) << 4) |
((values.AttackTime & 0b11) << 2) |
((values.HoldTime & 0b11) << 0);
I2C_Out[2] = 0x00 |
((values.NoiseGateThreshold & 0b1111) << 4) |
((values.AutomaticGainControlThreshold & 0b1111) << 0);
return I2cWrite(i2c, MAX9860_ADDRESS_WRITE, I2C_Out, 3, MAX9860_IO_TIMEOUT) == 3;
}
bool xAudioCodecSetPowerManagement(tI2cIO *i2c, MAX9860_PowerManagementState values) {
uint8_t I2C_Out[3] = {0};
I2C_Out[0] = MAX9860_REG_SYSTEM_SHUTDOWN;
I2C_Out[1] = 0x00 |
((values.FullPowerOn & 0b1) << 7) |
((values.DAC_Enabled & 0b1) << 3) |
((values.ADC_EnabledLeft & 0b1) << 1) |
((values.ADC_EnabledRight & 0b1) << 0);
return I2cWrite(i2c, MAX9860_ADDRESS_WRITE, I2C_Out, 2, MAX9860_IO_TIMEOUT) == 2;
}
uint16_t xAudioCodecDebugGetRAW(tI2cIO *i2c, uint8_t *raw) {
return I2cRead(i2c, MAX9860_ADDRESS_READ, raw, MAX9860_TOTAL_REG_COUNT, MAX9860_IO_TIMEOUT);
}
uint16_t xAudioCodecDebugSetRAW(tI2cIO *i2c, uint8_t *raw) {
return I2cRead(i2c, MAX9860_ADDRESS_WRITE, raw, MAX9860_TOTAL_REG_COUNT, MAX9860_IO_TIMEOUT);
}
uint16_t xAudioCodecReadStatus(tI2cIO *i2c, uint8_t statuses[3]) {
uint8_t I2C_Out[4] = {0};
I2C_Out[0] = MAX9860_REG_STATUS_INTERRUPTS_VALUES;
uint16_t write = I2cWrite(i2c, MAX9860_ADDRESS_WRITE, I2C_Out, 1, MAX9860_IO_TIMEOUT);
uint16_t reed = I2cRead(i2c, MAX9860_ADDRESS_READ, I2C_Out + 1, 3, MAX9860_IO_TIMEOUT);
memcpy(statuses, I2C_Out + 1, reed);
return reed;
}
//void PowerSuportInitAudioDevice(PowerSupportEnvironment* env){
// HAL_StatusTypeDef error;
//
// uint8_t I2C_Out[16] = {0};
// uint8_t I2C_In[17] = {0};
//
// // 0 1 2 3 4 5 6 7 8 9 0A 0B 0C 0D 0E 0F 10
// // 0x00 0x00 0x00 0x10 0x1E 0x3F 0x24 0x00 0x00 0x06 0x33 0x00 0x4A 0x00 0x00 0x00 0x8A
// // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
// I2C_Out[0] = 0x03; //Address
// I2C_Out[1] = 0x10; //0x03 System Clock
// I2C_Out[2] = 0x10; //0x04 Stereo Audio Clock / Control High
// I2C_Out[3] = 0x62; //0x05 Stereo Audio Clock / Control Low
// I2C_Out[4] = 0x40; //0x06 Interface
// I2C_Out[5] = 0x00; //0x07 Interface
// I2C_Out[6] = 0x00; //0x08 Voice Filter
// I2C_Out[7] = 0x08; //0x09 DAC Attenuation DAC Level Adjust -10:0x1A
// I2C_Out[8] = 0x33; //0x0A ADC Output Levels DA Level 4:[left -10:0xD][right -10:0xD]
// I2C_Out[9] = 0x00; //0x0B DAC Gain and Sidetone 0 2:[DVG 00] 5:[DVST -10:0x00]
// I2C_Out[10] = 0x4A; //0x0C Microphone Gain -- 0 2:[MicPreAmp 00] 5:[Mic PGA 0x14]
// I2C_Out[11] = 0x00; //0x0D Reserved
// I2C_Out[12] = 0x00; //0x0E Microphone AGC
// I2C_Out[13] = 0x00; //0x0F Noise Gate, Microphone AGC
// I2C_Out[14] = 0x8A; //0x10 System Shutdown
//
// error = HAL_I2C_Master_Transmit(env->audioI2c, 0x20, I2C_Out, 15, 500);
//
// I2C_Out[0] = 0x00;
// error = HAL_I2C_Master_Receive(env->audioI2c, 0x21, I2C_In, 17, 500);
//}