191 lines
6.5 KiB
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);
|
|
//}
|
|
|
|
|
|
|
|
|