149 (0x80 | 0x40 | 0x10 | 0x04);
201 i2s_format_t fmt,
bool is_master, uint8_t channels)
override {
204 return begin(sample_rate, bits, 12000000,
toFormat(fmt), is_master, is_master);
220 bool begin(uint32_t sample_rate = 44100, uint8_t word_size = 16,
221 uint32_t mclk_freq = 12000000,
223 bool bclk_controller =
false,
bool wclk_controller =
false) {
228 rc &=
configureClocks(mclk_freq, sample_rate, bclk_controller, word_size);
229 rc &=
configureDai(word_size, fmt, bclk_controller, wclk_controller);
244 bool bclk_controller =
false, uint8_t word_size = 16) {
246 uint32_t dac_clk, mod_clk;
247 uint32_t ndac, mdac, bclk_div = 0;
248 int osr, osr_min, osr_max;
256 dac_clk = mclk_freq / ndac;
264 int multiple = (int)osr_multiple;
265 osr_max = (osr_max / multiple) * multiple;
266 osr_min = ((osr_min + multiple - 1) / multiple) * multiple;
270 while (osr >= osr_min) {
271 mod_clk = sample_rate * osr;
272 mdac = dac_clk / mod_clk;
273 if ((mdac * mod_clk) == dac_clk) {
279 if (osr < osr_min || mdac == 0) {
283 if (bclk_controller) {
284 uint32_t num = (uint32_t)osr * mdac;
285 uint32_t den = (uint32_t)word_size * 2U;
286 bclk_div = num / den;
287 if ((bclk_div * den) != num) {
302 if (bclk_controller) {
308 uint32_t mclk_div = (mclk_freq + 999999) / 1000000;
318 bool bclk_controller =
false,
bool wclk_controller =
false) {
349 if (sample_rate >= 192000) {
351 }
else if (sample_rate >= 96000) {
492 static const uint8_t vol_array[] = {107, 108, 110, 113, 116, 120,
493 125, 128, 132, 138, 144};
503 size_t n =
sizeof(vol_array) /
sizeof(vol_array[0]);
504 while (idx < n && vol_array[idx] < (uint8_t)v) idx++;
507 vol_val = (uint8_t)v;
536 bool enableBeep(uint32_t freq_hz, uint32_t duration_ms = 500,
537 int8_t left_db = 0, int8_t right_db = 0) {
539 static constexpr float kTwoPi = 6.28318530717959f;
542 int16_t sin_q15 = (int16_t)(sinf(angle) * 32767.0f);
543 int16_t cos_q15 = (int16_t)(cosf(angle) * 32767.0f);
545 uint32_t num_samples = (duration_ms == 0)
548 if (num_samples > 0xFFFFFFu) num_samples = 0xFFFFFFu;
628 int8_t clamped = vol_db > 2 ? (int8_t)2 : (vol_db < -61 ? (int8_t)-61 : vol_db);
Header only C++ driver for the TLV320DAC3100 / TLV320DAC3101 audio DAC.
Definition TLV320DAC310x.h:75
static constexpr uint8_t MDAC_POWER_UP
Definition TLV320DAC310x.h:126
static constexpr uint8_t OSR_MSB_ADDR
Definition TLV320DAC310x.h:82
bool isBeepActive()
Definition TLV320DAC310x.h:573
static constexpr uint8_t MDAC_POWER_UP_MASK
Definition TLV320DAC310x.h:127
static constexpr uint8_t NDAC_POWER_UP
Definition TLV320DAC310x.h:122
static TLV320DAC310xFormat toFormat(i2s_format_t fmt)
Map the generic I2S format to the TLV320DAC310x specific format.
Definition TLV320DAC310x.h:645
static constexpr int OUTPUT_VOLUME_MAX
Definition TLV320DAC310x.h:192
static constexpr uint8_t TIMER_MCLK_DIV_ADDR
Definition TLV320DAC310x.h:117
bool setDevices(input_device_t input_device, output_device_t output_device) override
Stores the output device selection for use by configureOutput()
Definition TLV320DAC310x.h:580
static constexpr uint8_t OSR_MSB_MASK
Definition TLV320DAC310x.h:134
static constexpr uint8_t HPX_DRV_UNMUTE
Definition TLV320DAC310x.h:184
static constexpr uint32_t DAC_MOD_CLK_FREQ_MIN
Definition TLV320DAC310x.h:131
bool readPagedReg(uint8_t page, uint8_t reg, uint8_t &value)
Read a register on the given page.
Definition TLV320DAC310x.h:679
static constexpr uint8_t SOFT_RESET_ASSERT
Definition TLV320DAC310x.h:120
uint32_t current_sample_rate
Definition TLV320DAC310x.h:619
bool begin(uint32_t sample_rate=44100, uint8_t word_size=16, uint32_t mclk_freq=12000000, TLV320DAC310xFormat fmt=TLV320DAC310xFormat::I2S, bool bclk_controller=false, bool wclk_controller=false)
Initialize the codec.
Definition TLV320DAC310x.h:220
static constexpr uint8_t IF_CTRL_IFTYPE_MASK
Definition TLV320DAC310x.h:137
static constexpr uint8_t SPL_ANA_VOL_CTRL_ADDR
Definition TLV320DAC310x.h:110
bool softReset()
Soft reset of the codec.
Definition TLV320DAC310x.h:237
static constexpr uint8_t HPX_ANA_VOL_MAX
Definition TLV320DAC310x.h:178
static constexpr uint8_t HP_OUT_POP_RM_ADDR
Definition TLV320DAC310x.h:106
bool setOutputUnmute()
Unmute the output.
Definition TLV320DAC310x.h:480
static constexpr uint8_t HPL_ANA_VOL_CTRL_ADDR
Definition TLV320DAC310x.h:108
static constexpr uint8_t HPX_ANA_VOL_LOW_THRESH
Definition TLV320DAC310x.h:181
static constexpr uint8_t OUTPUT_ROUTING_HPR
Definition TLV320DAC310x.h:173
static constexpr uint8_t L_BEEP_GEN_ADDR
Definition TLV320DAC310x.h:92
static constexpr uint8_t PROC_BLK_SEL_MASK
Definition TLV320DAC310x.h:146
static constexpr int OUTPUT_VOLUME_MIN
Definition TLV320DAC310x.h:193
bool setOutputMute()
Mute the output (DAC channel mute, output stage stays powered)
Definition TLV320DAC310x.h:477
bool enableBeep(uint32_t freq_hz, uint32_t duration_ms=500, int8_t left_db=0, int8_t right_db=0)
Start the hardware sine-wave beep generator.
Definition TLV320DAC310x.h:536
static constexpr uint8_t VOL_CTRL_ADDR
Definition TLV320DAC310x.h:89
static constexpr uint8_t HEADPHONE_DRV_ADDR
Definition TLV320DAC310x.h:104
uint8_t active_page
0xFF forces a page select on first access
Definition TLV320DAC310x.h:618
static constexpr uint8_t MDAC_DIV_MASK
Definition TLV320DAC310x.h:128
static constexpr uint8_t NDAC_DIV_MASK
Definition TLV320DAC310x.h:124
static constexpr uint8_t VOL_MICDET_VOL_CTRL_PIN
Definition TLV320DAC310x.h:158
bool setMute(bool mute) override
Mutes/unmutes the output.
Definition TLV320DAC310x.h:606
static constexpr uint8_t SPEAKER_AMP_POWERUP
Definition TLV320DAC310x.h:164
TLV320DAC310xOutputMode output_mode
HP driver impedance mode, applied by configureOutput() and setOutputImpedance()
Definition TLV320DAC310x.h:623
bool setOutputImpedance(TLV320DAC310xOutputMode mode)
Set the HP output driver impedance mode and apply it immediately to register 44.
Definition TLV320DAC310x.h:596
static constexpr uint8_t NDAC_DIV_ADDR
Definition TLV320DAC310x.h:80
static constexpr uint8_t BEEP_LEN_MID_ADDR
Definition TLV320DAC310x.h:95
static constexpr uint8_t HPX_ANA_VOL_ENABLE
Definition TLV320DAC310x.h:176
output_device_t output_device
Output device selection set via setDevices(), used by configureOutput()
Definition TLV320DAC310x.h:621
bool disableBeep()
Stop the beep generator immediately by clearing the enable bit.
Definition TLV320DAC310x.h:567
static constexpr uint8_t BEEP_COS_LSB_ADDR
Definition TLV320DAC310x.h:100
static constexpr uint8_t SOFT_RESET_ADDR
Definition TLV320DAC310x.h:79
static constexpr uint8_t BCLK_DIV_MASK
Definition TLV320DAC310x.h:144
static constexpr uint8_t SPK_DRV_GAIN_CTRL_ADDR
Definition TLV320DAC310x.h:113
static constexpr uint8_t VOL_CTRL_MUTE_DEFAULT
Definition TLV320DAC310x.h:153
static constexpr uint8_t DATA_PATH_SETUP_ADDR
Definition TLV320DAC310x.h:88
static constexpr uint8_t OUTPUT_ROUTING_MIXERL
Definition TLV320DAC310x.h:172
static constexpr uint8_t OUTPUT_ROUTING_HPL
Definition TLV320DAC310x.h:171
bool updatePagedReg(uint8_t page, uint8_t reg, uint8_t mask, uint8_t value)
Read-Modify-Write of a register on the given page.
Definition TLV320DAC310x.h:685
bool configureClocks(uint32_t mclk_freq, uint32_t sample_rate, bool bclk_controller=false, uint8_t word_size=16)
Configure NDAC/MDAC/OSR dividers (and optionally BCLK divider) to derive the DAC processing/modulator...
Definition TLV320DAC310x.h:243
static constexpr uint8_t SPK_DRV_UNMUTE
Definition TLV320DAC310x.h:167
static constexpr uint8_t BCLK_DIV_POWER_UP_MASK
Definition TLV320DAC310x.h:143
static constexpr uint8_t VOL_CTRL_UNMUTE_DEFAULT
Definition TLV320DAC310x.h:152
TLV320DAC310xOutputMode resolveOutputMode() const
Resolve Auto → Headphone when LINE1 is selected, LineOut otherwise.
Definition TLV320DAC310x.h:633
static constexpr uint8_t TIMER_MCLK_DIV_EN_EXT
Definition TLV320DAC310x.h:188
static constexpr uint8_t HP_OUT_POP_RM_ENABLE
Definition TLV320DAC310x.h:169
static constexpr uint8_t OSR_LSB_ADDR
Definition TLV320DAC310x.h:83
static constexpr uint8_t L_DIG_VOL_CTRL_ADDR
Definition TLV320DAC310x.h:90
static constexpr uint32_t DAC_MOD_CLK_FREQ_MAX
Definition TLV320DAC310x.h:132
bool startOutput()
Power up & unmute the DAC channels and start the output.
Definition TLV320DAC310x.h:461
static constexpr uint8_t VOL_MICDET_ADC_CTRL_ADDR
Definition TLV320DAC310x.h:101
TLV320DAC310x()
Definition TLV320DAC310x.h:195
bool setOutputVolume(int vol)
Set the headphone output (analog) volume.
Definition TLV320DAC310x.h:491
bool setOutputMute(bool mute)
Mute / unmute the output.
Definition TLV320DAC310x.h:483
static constexpr uint8_t BEEP_GEN_EN_BEEP
Definition TLV320DAC310x.h:155
static constexpr uint8_t SPEAKER_AMP_RESERVED
Definition TLV320DAC310x.h:165
static constexpr uint8_t BCLK_DIV_POWER_UP
Definition TLV320DAC310x.h:142
static constexpr uint8_t BEEP_SIN_MSB_ADDR
Definition TLV320DAC310x.h:97
static constexpr uint8_t BEEP_COS_MSB_ADDR
Definition TLV320DAC310x.h:99
static constexpr uint8_t SPEAKER_AMP_ADDR
Definition TLV320DAC310x.h:105
static constexpr uint8_t IF_CTRL1_ADDR
Definition TLV320DAC310x.h:84
static constexpr uint8_t HEADPHONE_DRV_CM_MASK
Definition TLV320DAC310x.h:161
static constexpr uint8_t PROC_BLK_SEL_ADDR
Definition TLV320DAC310x.h:87
static constexpr uint8_t MDAC_DIV_ADDR
Definition TLV320DAC310x.h:81
static constexpr uint8_t HEADPHONE_DRV_POWERUP
Definition TLV320DAC310x.h:160
static constexpr uint8_t IF_CTRL_BCLK_OUT
Definition TLV320DAC310x.h:139
bool begin(uint32_t sample_rate, uint8_t bits, codec_mode_t mode, i2s_format_t fmt, bool is_master, uint8_t channels) override
Definition TLV320DAC310x.h:200
static constexpr uint8_t HEADPHONE_DRV_CTRL_ADDR
Definition TLV320DAC310x.h:114
static constexpr uint8_t OSR_LSB_MASK
Definition TLV320DAC310x.h:135
static constexpr uint8_t R_BEEP_GEN_ADDR
Definition TLV320DAC310x.h:93
static constexpr uint8_t HPL_DRV_GAIN_CTRL_ADDR
Definition TLV320DAC310x.h:111
bool applyProperties()
no-op, nothing is cached that needs re-applying
Definition TLV320DAC310x.h:517
static constexpr uint8_t IF_CTRL_WLEN_MASK
Definition TLV320DAC310x.h:138
bool selectPage(uint8_t page)
Select the active register page (cached, only writes if changed)
Definition TLV320DAC310x.h:665
static constexpr uint8_t OVF_FLAG_ADDR
Definition TLV320DAC310x.h:86
static constexpr uint8_t IF_CTRL_WCLK_OUT
Definition TLV320DAC310x.h:140
static constexpr uint8_t BEEP_LEN_MSB_ADDR
Definition TLV320DAC310x.h:94
static constexpr uint8_t HPX_ANA_VOL_DEFAULT
Definition TLV320DAC310x.h:179
static constexpr uint8_t OUTPUT_ROUTING_MIXERR
Definition TLV320DAC310x.h:174
static constexpr uint32_t DAC_PROC_CLK_FREQ_MAX
Definition TLV320DAC310x.h:130
static constexpr uint8_t OUTPUT_ROUTING_ADDR
Definition TLV320DAC310x.h:107
static constexpr uint8_t TIMER_MCLK_DIV_MASK
Definition TLV320DAC310x.h:189
static constexpr uint8_t BEEP_VOL_MASK
Definition TLV320DAC310x.h:156
static constexpr uint8_t DAC_LR_POWERUP_DEFAULT
Definition TLV320DAC310x.h:148
static constexpr uint8_t BEEP_LEN_LSB_ADDR
Definition TLV320DAC310x.h:96
static constexpr uint8_t HEADPHONE_DRV_LINEOUT
Definition TLV320DAC310x.h:186
bool configureDai(uint8_t word_size=16, TLV320DAC310xFormat fmt=TLV320DAC310xFormat::I2S, bool bclk_controller=false, bool wclk_controller=false)
Configure the digital audio interface (format, word length, clock directions)
Definition TLV320DAC310x.h:316
static constexpr uint8_t HPR_ANA_VOL_CTRL_ADDR
Definition TLV320DAC310x.h:109
bool stopOutput()
Mute and power down the DAC channels.
Definition TLV320DAC310x.h:469
static constexpr uint8_t HEADPHONE_DRV_RESERVED
Definition TLV320DAC310x.h:162
bool setVolume(int volume) override
Definition TLV320DAC310x.h:610
static constexpr uint8_t DRC_CTRL1_ADDR
Definition TLV320DAC310x.h:91
static constexpr uint8_t BCLK_DIV_ADDR
Definition TLV320DAC310x.h:85
bool writePagedReg(uint8_t page, uint8_t reg, uint8_t value)
Write a register on the given page.
Definition TLV320DAC310x.h:673
static constexpr uint8_t DAC_LR_POWERDN_DEFAULT
Definition TLV320DAC310x.h:150
bool configureOutput(TLV320DAC310xCmVoltage cm=TLV320DAC310xCmVoltage::V1P65)
Configure the output path(s) selected via setDevices(): common mode voltage, pop removal,...
Definition TLV320DAC310x.h:370
static constexpr uint8_t HPX_ANA_VOL_MASK
Definition TLV320DAC310x.h:177
static constexpr uint8_t PAGE_CONTROL_ADDR
Definition TLV320DAC310x.h:78
static constexpr uint8_t HPR_DRV_GAIN_CTRL_ADDR
Definition TLV320DAC310x.h:112
static uint8_t analogVolReg(uint8_t vol)
Build the register value for the HPx analog volume control registers.
Definition TLV320DAC310x.h:640
static constexpr uint8_t HPX_ANA_VOL_MIN
Definition TLV320DAC310x.h:180
static constexpr uint8_t NDAC_POWER_UP_MASK
Definition TLV320DAC310x.h:123
static constexpr uint8_t HPX_ANA_VOL_FLOOR
Definition TLV320DAC310x.h:182
static uint8_t beepVolReg(int8_t vol_db)
Definition TLV320DAC310x.h:627
static TLV320DAC310xOsrMultiple getOsrMultiple(uint32_t sample_rate)
Definition TLV320DAC310x.h:658
static constexpr uint8_t BEEP_SIN_LSB_ADDR
Definition TLV320DAC310x.h:98
bool configureFilters(uint32_t sample_rate)
Select the decimation filter / processing block based on the sample rate.
Definition TLV320DAC310x.h:347
Common parent class for codec drivers that have been ported from the Zephyr RTOS audio driver impleme...
Definition ZephyrDriverCommon.h:22
uint8_t i2c_addr
Definition ZephyrDriverCommon.h:87
bool updateReg(uint8_t reg, uint8_t mask, uint8_t value)
Read-Modify-Write of a single byte register.
Definition ZephyrDriverCommon.h:110
int volume_percent
Last volume (in %) provided to setVolume()
Definition ZephyrDriverCommon.h:89
bool readReg(uint8_t reg, uint8_t &value, bool stopBit=true)
Reads a single byte from an 8 bit register address.
Definition ZephyrDriverCommon.h:100
bool writeReg(uint8_t reg, uint8_t value)
Writes a single byte to an 8 bit register address.
Definition ZephyrDriverCommon.h:94
Namespace for audio driver components.
Definition AudioBoard.h:5
TLV320DAC310xProcBlock
Processing block / decimation filter selection (see codec_configure_filters)
Definition TLV320DAC310x.h:43
@ DecimationB
PRB_P10, used for PCM rates >= 96kHz.
@ DecimationC
PRB_P18, used for PCM rates >= 192kHz.
@ DecimationA
PRB_P25, used for PCM rates < 96kHz.
TLV320DAC310xOsrMultiple
OSR multiple, determined from the PCM sample rate.
Definition TLV320DAC310x.h:50
input_device_t
Definition DriverCommon.h:170
TLV320DAC310xOutputMode
HP output driver impedance / bias mode (Page 1 / Register 44 D2-D1)
Definition TLV320DAC310x.h:36
@ Auto
Derive from output_device: LINE1 → Headphone, otherwise LineOut.
@ Headphone
Low-impedance headphone driver mode, optimised for 16–32 Ω loads.
@ LineOut
High-impedance line-out driver mode, optimised for ≥10 kΩ loads.
codec_mode_t
Definition DriverCommon.h:290
output_device_t
Definition DriverCommon.h:186
@ DAC_OUTPUT_LINE1
Definition DriverCommon.h:188
@ DAC_OUTPUT_ALL
Definition DriverCommon.h:190
@ DAC_OUTPUT_LINE2
Definition DriverCommon.h:189
TLV320DAC310xWordLength
Word length of the digital audio interface.
Definition TLV320DAC310x.h:28
TLV320DAC310xCmVoltage
Headphone driver common mode voltage.
Definition TLV320DAC310x.h:57
i2s_format_t
Definition DriverCommon.h:250
@ I2S_RIGHT
Definition DriverCommon.h:253
@ I2S_DSP
Definition DriverCommon.h:254
@ I2S_LEFT
Definition DriverCommon.h:252
TLV320DAC310xFormat
Digital audio interface format.
Definition TLV320DAC310x.h:20