255 lines
8.2 KiB
C++
255 lines
8.2 KiB
C++
/*
|
|
* HiFi Audio Codec Module support library for Teensy 3.x
|
|
*
|
|
* Copyright 2015, Michele Perla
|
|
*
|
|
*/
|
|
#ifndef control_ak4558_h_
|
|
#define control_ak4558_h_
|
|
|
|
#include "AudioControl.h"
|
|
|
|
#define AK4558_SERIAL_DEBUG 1
|
|
//if 1, then Serial Monitor will show debug information about configuration of the AK4558
|
|
|
|
// for Teensy audio lib operation the following settings are needed
|
|
// 1fs = 44.1 KHz
|
|
// sample size = 16 bits
|
|
// MCKI : 11.2896 MHz
|
|
// BICK : 1.4112 MHz
|
|
// LRCK : 44.100 KHz
|
|
// to do so we need to set the following bits:
|
|
// PMPLL = 0 (EXT Slave Mode; disables internal PLL and uses ext. clock) (by DEFAULT)
|
|
// ACKS = 0 (Manual Setting Mode; disables automatic clock selection) (by DEFAULT)
|
|
// DFS1-0 = 00 (Sampling Speed = Normal Speed Mode, default)
|
|
// MCKS1-0 = 00 (Master Clock Input Frequency Select, set 256fs for Normal Speed Mode -> 11.2896 MHz)
|
|
// BCKO1-0 = 00 (BICK Output Frequency at Master Mode = 32fs = 1.4112 MHz)
|
|
// TDM1-0 = 00 (Time Division Multiplexing mode OFF) (by DEFAULT)
|
|
// DIF2-1-0 = 011 ( 16 bit I2S compatible when BICK = 32fs)
|
|
|
|
#ifndef PIN_PDN
|
|
#define PIN_PDN 1
|
|
#endif
|
|
// Power-Down & Reset Mode Pin
|
|
// “L”: Power-down and Reset, “H”: Normal operation
|
|
// The AK4558 should be reset once by bringing PDN pin = “L”
|
|
|
|
#ifndef AK4558_CAD1
|
|
#define AK4558_CAD1 1
|
|
#endif
|
|
// Chip Address 1 pin
|
|
// set to 'H' by default, configurable to 'L' via a jumper on bottom side of the board
|
|
|
|
#ifndef AK4558_CAD0
|
|
#define AK4558_CAD0 1
|
|
#endif
|
|
// Chip Address 0 pin
|
|
// set to 'H' by default, configurable to 'L' via a jumper on bottom side of the board
|
|
|
|
#define AK4558_I2C_ADDR (0x10 + (AK4558_CAD1<<1) + AK4558_CAD0)
|
|
// datasheet page 81:
|
|
// This address is 7 bits long followed by the eighth bit that is a data direction bit (R/W).
|
|
// The most significant five bits of the slave address are fixed as “00100”. The next bits are
|
|
// CAD1 and CAD0 (device address bit). These bits identify the specific device on the bus.
|
|
// The hard-wired input pins (CAD1 and CAD0) set these device address bits (Figure 69)
|
|
|
|
// Power Management register
|
|
#define AK4558_PWR_MNGT 0x00
|
|
// D4 D3 D2 D1 D0
|
|
// PMADR PMADL PMDAR PMDAL RSTN
|
|
#define AK4558_PMADR (1u<<4)
|
|
#define AK4558_PMADL (1u<<3)
|
|
// PMADL/R: ADC L/Rch Power Management
|
|
// 0: ADC L/Rch Power Down (default)
|
|
// 1: Normal Operation
|
|
#define AK4558_PMDAR (1u<<2)
|
|
#define AK4558_PMDAL (1u<<1)
|
|
// PMDAL/R: DAC L/Rch Power Management
|
|
// 0: DAC L/Rch Power Down (default)
|
|
// 1: Normal Operation
|
|
#define AK4558_RSTN (1u)
|
|
// RSTN: Internal Timing Reset
|
|
// 0: Reset Register values are not reset.
|
|
// 1: Normal Operation (default)
|
|
|
|
|
|
// PLL Control register
|
|
#define AK4558_PLL_CTRL 0X01
|
|
// D4 D3 D2 D1 D0
|
|
// PLL3 PLL2 PLL1 PLL0 PMPLL
|
|
#define AK4558_PLL3 (1u<<4)
|
|
#define AK4558_PLL2 (1u<<3)
|
|
#define AK4558_PLL1 (1u<<2)
|
|
#define AK4558_PLL0 (1u<<1)
|
|
// PLL3-0: PLL Reference Clock Select (Table 16)
|
|
// Default: “0010” (BICK pin=64fs)
|
|
#define AK4558_PMPLL (1u)
|
|
// PMPLL: PLL Power Management
|
|
// 0: EXT Mode and Power down (default)
|
|
// 1: PLL Mode and Power up
|
|
|
|
|
|
// DAC TDM register
|
|
#define AK4558_DAC_TDM 0X02
|
|
// D1 D0
|
|
// SDS1 SDS0
|
|
#define AK4558_SDS1 (1u<<1)
|
|
#define AK4558_SDS0 (1u)
|
|
// SDS1-0: DAC TDM Data Select (Table 24)
|
|
// Default: “00”
|
|
|
|
|
|
// Control 1 register
|
|
#define AK4558_CTRL_1 0X03
|
|
// D7 D6 D5 D4 D3 D2 D1 D0
|
|
// TDM1 TDM0 DIF2 DIF1 DIF0 ATS1 ATS0 SMUTE
|
|
#define AK4558_TDM1 (1u<<7)
|
|
#define AK4558_TDM0 (1u<<6)
|
|
// TDM1-0: TDM Format Select (Table 23, Table 25, Table 26)
|
|
// Default: “00” (Stereo Mode)
|
|
#define AK4558_DIF2 (1u<<5)
|
|
#define AK4558_DIF1 (1u<<4)
|
|
#define AK4558_DIF0 (1u<<3)
|
|
// DIF2-0: Audio Interface Format Mode Select (Table 23)
|
|
// Default: “111” (32bit I2S)
|
|
#define AK4558_ATS1 (1u<<2)
|
|
#define AK4558_ATS0 (1u<<1)
|
|
// ATS1-0: Transition Time Setting of Digital Attenuator (Table 31)
|
|
// Default: “00”
|
|
#define AK4558_SMUTE (1u)
|
|
// SMUTE: Soft Mute Enable
|
|
// 0: Normal Operation (default)
|
|
// 1: All DAC outputs are soft muted.
|
|
|
|
|
|
// Control 2 register
|
|
#define AK4558_CTRL_2 0X04
|
|
// D4 D3 D2 D1 D0
|
|
// MCKS1 MCKS0 DFS1 DFS0 ACKS
|
|
#define AK4558_MCKS1 (1u<<4)
|
|
#define AK4558_MCKS0 (1u<<3)
|
|
// MCKS1-0: Master Clock Input Frequency Select (Table 9, follows):
|
|
// MCKS1 MCKS0 NSM DSM QSM
|
|
// 0 0 256fs 256fs 128fs
|
|
// 0 1 384fs 256fs 128fs
|
|
// 1 0 512fs 256fs 128fs (default)
|
|
// 1 1 768fs 256fs 128fs
|
|
#define AK4558_DFS1 (1u<<2)
|
|
#define AK4558_DFS0 (1u<<1)
|
|
// DFS1-0: Sampling Speed Control (Table 8)
|
|
// The setting of DFS1-0 bits is ignored when ACKS bit =“1”.
|
|
#define AK4558_ACKS (1u)
|
|
// ACKS: Automatic Clock Recognition Mode
|
|
// 0: Disable, Manual Setting Mode (default)
|
|
// 1: Enable, Auto Setting Mode
|
|
// When ACKS bit = “1”, master clock frequency is detected automatically. In this case, the setting of
|
|
// DFS1-0 bits is ignored. When ACKS bit = “0”, DFS1-0 bits set the sampling speed mode. The MCKI
|
|
// frequency of each mode is detected automatically.
|
|
|
|
|
|
// Mode Control register
|
|
#define AK4558_MODE_CTRL 0X05
|
|
// D6 D5 D4 D3 D2 D1 D0
|
|
// FS3 FS2 FS1 FS0 BCKO1 BCKO0 LOPS
|
|
#define AK4558_FS3 (1u<<6)
|
|
#define AK4558_FS2 (1u<<5)
|
|
#define AK4558_FS1 (1u<<4)
|
|
#define AK4558_FS0 (1u<<3)
|
|
// FS3-0: Sampling Frequency (Table 17, Table 18)
|
|
// Default: “0101”
|
|
#define AK4558_BCKO1 (1u<<2)
|
|
#define AK4558_BCKO0 (1u<<1)
|
|
// BCKO1-0: BICK Output Frequency Setting in Master Mode (Table 21)
|
|
// Default: “01” (64fs)
|
|
#define AK4558_LOPS (1u<<0)
|
|
// LOPS: Power-save Mode of LOUT/ROUT
|
|
// 0: Normal Operation (default)
|
|
// 1: Power-save Mode
|
|
|
|
|
|
// Filter Setting register
|
|
#define AK4558_FLTR_SET 0x06
|
|
// D7 D6 D5 D4 D3 D2 D1 D0
|
|
// FIRDA2 FIRDA1 FIRDA0 SLDA SDDA SSLOW DEM1 DEM0
|
|
#define AK4558_FIRDA2 (1u<<7)
|
|
#define AK4558_FIRDA1 (1u<<6)
|
|
#define AK4558_FIRDA0 (1u<<5)
|
|
// FIRDA2-0: Out band noise eliminating Filters Setting (Table 32)
|
|
// default: “001” (48kHz)
|
|
#define AK4558_SLDA (1u<<4)
|
|
// SLDA: DAC Slow Roll-off Filter Enable (Table 28)
|
|
// 0: Sharp Roll-off filter (default)
|
|
// 1: Slow Roll-off Filter
|
|
#define AK4558_SDDA (1u<<3)
|
|
// SDDA: DAC Short delay Filter Enable (Table 28)
|
|
// 0: Normal filter
|
|
// 1: Short delay Filter (default)
|
|
#define AK4558_SSLOW (1u<<2)
|
|
// SSLOW: Digital Filter Bypass Mode Enable
|
|
// 0: Roll-off filter (default)
|
|
// 1: Super Slow Roll-off Mode
|
|
#define AK4558_DEM1 (1u<<1)
|
|
#define AK4558_DEM0 (1u)
|
|
// DEM1-0: De-emphasis response control for DAC (Table 22)
|
|
// Default: “01”, OFF
|
|
|
|
|
|
// HPF Enable, Filter Setting
|
|
#define AK4558_HPF_EN_FLTR_SET 0x07
|
|
// D3 D2 D1 D0
|
|
// SLAD SDAD HPFER HPFEL
|
|
#define AK4558_SLAD (1u<<3)
|
|
// SLAD: ADC Slow Roll-off Filter Enable (Table 27)
|
|
// 0: Sharp Roll-off filter (default)
|
|
// 1: Slow Roll-off Filter
|
|
#define AK4558_SDAD (1u<<2)
|
|
// SDAD: ADC Short delay Filter Enable (Table 27)
|
|
// 0: Normal filter
|
|
// 1: Short delay Filter (default)
|
|
#define AK4558_HPFER (1u<<1)
|
|
#define AK4558_HPFEL (1u)
|
|
// HPFEL/R: ADC HPF L/Rch Setting
|
|
// 0: HPF L/Rch OFF
|
|
// 1: HPF L/Rch ON (default)
|
|
|
|
|
|
// LOUT Volume Control register
|
|
#define AK4558_LOUT_VOL 0X08
|
|
// D7 D6 D5 D4 D3 D2 D1 D0
|
|
// ATL7 ATL6 ATL5 ATL4 ATL3 ATL2 ATL1 ATL0
|
|
//
|
|
// ATL 7-0: Attenuation Level (Table 30)
|
|
// Default:FF(0dB)
|
|
|
|
|
|
// ROUT Volume Control register
|
|
#define AK4558_ROUT_VOL 0X09
|
|
// D7 D6 D5 D4 D3 D2 D1 D0
|
|
// ATR7 ATR6 ATR5 ATR4 ATR3 ATR2 ATR1 ATR0
|
|
//
|
|
// ATR 7-0: Attenuation Level (Table 30)
|
|
// Default:FF(0dB)
|
|
|
|
class AudioControlAK4558 : public AudioControl
|
|
{
|
|
public:
|
|
bool enable(void); //enables the CODEC, does not power up ADC nor DAC (use enableIn() and enableOut() for selective power up)
|
|
bool enableIn(void); //powers up ADC
|
|
bool enableOut(void); //powers up DAC
|
|
bool disable(void) { return (disableIn()&&disableOut()); } //powers down ADC/DAC
|
|
bool disableIn(void); //powers down ADC
|
|
bool disableOut(void); //powers down DAC
|
|
bool volume(float n); //sets LOUT/ROUT volume to n (range 0.0 - 1.0)
|
|
bool volumeLeft(float n); //sets LOUT volume to n (range 0.0 - 1.0)
|
|
bool volumeRight(float n); //sets ROUT volume to n (range 0.0 - 1.0)
|
|
bool inputLevel(float n) { return false; } //not supported by AK4558
|
|
bool inputSelect(int n) { return false; } //sets inputs to mono left, mono right, stereo (default stereo), not yet implemented
|
|
private:
|
|
uint8_t registers[10];
|
|
void initConfig(void);
|
|
void readConfig(void);
|
|
bool write(unsigned int reg, unsigned int val);
|
|
uint8_t convertVolume(float vol);
|
|
};
|
|
|
|
#endif |