arduino-audio-driver
Loading...
Searching...
No Matches
TLV320AIC3110.h
Go to the documentation of this file.
1
10#pragma once
11
12#include <cstddef>
13
15
16namespace audio_driver {
17
19enum class AIC3110Channel {
22 FrontLeft,
24 All,
25};
26
33
40
48
49namespace tlv320aic3110_detail {
57using RegAddr = uint16_t;
58constexpr RegAddr regAddr(uint8_t page, uint8_t reg) {
59 return (static_cast<RegAddr>(page) << 8) | reg;
60}
61constexpr uint8_t regAddrPage(RegAddr addr) { return addr >> 8; }
62constexpr uint8_t regAddrReg(RegAddr addr) { return addr & 0xFF; }
63} // namespace tlv320aic3110_detail
64
75 public:
77 static constexpr RegAddr regAddr(uint8_t page, uint8_t reg) {
78 return tlv320aic3110_detail::regAddr(page, reg);
79 }
80 static constexpr uint8_t regAddrPage(RegAddr addr) {
82 }
83 static constexpr uint8_t regAddrReg(RegAddr addr) {
85 }
86
87 // ---- Page 0 registers ----
119
120 // ---- Page 1 registers ----
139
140 // ---- Page 3 registers ----
142
143 // ---- Bit definitions ----
144 static constexpr uint8_t SOFT_RESET_ASSERT = 1;
145 static constexpr uint8_t CLOCK_GEN_MUX_DEFAULT = 0x3;
146
147 static constexpr uint8_t PLL_POWER_UP = (1 << 7);
148 static constexpr uint8_t PLL_P_MASK = 0x7;
149 static constexpr uint8_t PLL_R_MASK = 0xF;
150 static uint8_t PLL_P(uint8_t val) { return ((val & PLL_P_MASK) << 4); }
151 static uint8_t PLL_R(uint8_t val) { return (val & PLL_R_MASK); }
152
153 static constexpr uint8_t NDAC_POWER_UP = (1 << 7);
154 static constexpr uint8_t NDAC_DIV_MASK = 0x7F;
155 static constexpr uint8_t MDAC_POWER_UP = (1 << 7);
156 static constexpr uint8_t MDAC_DIV_MASK = 0x7F;
157 static constexpr uint8_t OSR_MSB_MASK = 0x3;
158 static constexpr uint8_t OSR_LSB_MASK = 0xFF;
159 static constexpr uint8_t NADC_POWER_UP = (1 << 7);
160 static constexpr uint8_t NADC_DIV_MASK = 0x7F;
161 static constexpr uint8_t MADC_POWER_UP = (1 << 7);
162 static constexpr uint8_t MADC_DIV_MASK = 0x7F;
163
164 static uint8_t NDAC_DIV(uint8_t val) { return val & NDAC_DIV_MASK; }
165 static uint8_t MDAC_DIV(uint8_t val) { return val & MDAC_DIV_MASK; }
166 static uint8_t NADC_DIV(uint8_t val) { return val & NADC_DIV_MASK; }
167 static uint8_t MADC_DIV(uint8_t val) { return val & MADC_DIV_MASK; }
168 static uint8_t BCLK_DIV(uint8_t val) { return val & MDAC_DIV_MASK; }
169
170 // IF_CTRL1 (audio interface) fields
171 static constexpr uint8_t IF_CTRL_IFTYPE_I2S = 0;
172 static constexpr uint8_t IF_CTRL_IFTYPE_DSP = 1;
173 static constexpr uint8_t IF_CTRL_IFTYPE_RJF = 2;
174 static constexpr uint8_t IF_CTRL_IFTYPE_LJF = 3;
175 static uint8_t IF_CTRL_IFTYPE(uint8_t val) { return (val & 0x1) << 6; }
176 static constexpr uint8_t IF_CTRL_WLEN_16 = 0;
177 static constexpr uint8_t IF_CTRL_WLEN_20 = 1;
178 static constexpr uint8_t IF_CTRL_WLEN_24 = 2;
179 static constexpr uint8_t IF_CTRL_WLEN_32 = 3;
180 static uint8_t IF_CTRL_WLEN(uint8_t val) { return (val & 0x3) << 4; }
181 static constexpr uint8_t IF_CTRL_BCLK_OUT = (1 << 3);
182 static constexpr uint8_t IF_CTRL_WCLK_OUT = (1 << 2);
183 static constexpr uint8_t IF_CTRL_DOUT_HIGH_Z = (1 << 0);
184
185 static constexpr uint8_t BCLK_DIV_POWER_UP = (1 << 7);
186
187 static constexpr uint8_t DAC_LR_POWERUP_DEFAULT =
188 (1 << 7) | (1 << 6) | (1 << 4) | (1 << 2);
189 static constexpr uint8_t DAC_LR_POWERDN_DEFAULT = (1 << 4) | (1 << 2);
190
191 static constexpr uint8_t VOL_CTRL_UNMUTE_DEFAULT = 0;
192 static constexpr uint8_t VOL_CTRL_MUTE_DEFAULT = (1 << 3) | (1 << 2);
193
194 static constexpr uint8_t BEEP_GEN_EN_BEEP = (1 << 7);
195
196 // Headphone driver
197 static constexpr uint8_t HEADPHONE_DRV_POWERUP = (1 << 7) | (1 << 6);
198 static constexpr uint8_t HEADPHONE_DRV_CM_MASK = (0x3 << 3);
199 static uint8_t HEADPHONE_DRV_CM(uint8_t val) {
200 return (uint8_t)((val << 3) & HEADPHONE_DRV_CM_MASK);
201 }
202 static constexpr uint8_t HEADPHONE_DRV_RESERVED = (1 << 2);
203 static constexpr uint8_t HEADPHONE_DRV_LINEOUT = (1 << 1) | (1 << 2);
204
205 static constexpr uint8_t HP_OUT_POP_RM_ENABLE = (1 << 7);
206
207 static constexpr uint8_t OUTPUT_ROUTING_HPL = (1 << 7);
208 static constexpr uint8_t OUTPUT_ROUTING_HPR = (1 << 3);
209 static constexpr uint8_t OUTPUT_ROUTING_MIXER = (1 << 6) | (1 << 2);
210
211 // Analog volume (headphone / speaker), 7 bit magnitude + enable bit
212 static constexpr uint8_t HPX_ANA_VOL_ENABLE = (1 << 7);
213 static constexpr uint8_t HPX_ANA_VOL_MASK = 0x7F;
214 static uint8_t HPX_ANA_VOL(uint8_t val) {
215 return (uint8_t)((val & HPX_ANA_VOL_MASK) | HPX_ANA_VOL_ENABLE);
216 }
217 static constexpr uint8_t HPX_ANA_VOL_MAX = 0;
218 static constexpr uint8_t HPX_ANA_VOL_DEFAULT = 0;
219 static constexpr uint8_t HPX_ANA_VOL_MIN = 127;
220 static constexpr uint8_t HPX_ANA_VOL_LOW_THRESH = 105;
221 static constexpr uint8_t HPX_ANA_VOL_FLOOR = 144;
222
223 static constexpr uint8_t SPX_ANA_VOL_ENABLE = (1 << 7);
224 static constexpr uint8_t SPX_ANA_VOL_MASK = 0x7F;
225 static uint8_t SPX_ANA_VOL(uint8_t val) {
226 return (uint8_t)((val & SPX_ANA_VOL_MASK) | SPX_ANA_VOL_ENABLE);
227 }
228 static constexpr uint8_t SPX_ANA_VOL_DEFAULT = 0;
229 static constexpr uint8_t SPX_ANA_VOL_LOW_THRESH = 105;
230 static constexpr uint8_t SPX_ANA_VOL_FLOOR = 144;
231
232 // Driver gain / mute control
233 static constexpr uint8_t HPX_DRV_UNMUTE = (1 << 2);
234 static constexpr uint8_t HPX_DRV_RESERVED = (1 << 1);
235 static constexpr uint8_t SPX_DRV_UNMUTE = (1 << 2);
236 static constexpr uint8_t SPX_DRV_RESERVED = (1 << 1);
237
238 // Class-D speaker driver
239 static constexpr uint8_t SPEAKER_DRV_POWERUP = (1 << 7) | (1 << 6);
240 static constexpr uint8_t SPEAKER_DRV_RESERVED = (1 << 2) | (1 << 1);
241
242 // Mic / ADC
243 static constexpr uint8_t MIC_ADC_POWERUP = (1 << 7);
244 static constexpr uint8_t MIC_FCTRL_DEFAULT = 0x0;
245 static constexpr uint8_t MIC_CCTRL_DEFAULT = 0x0;
246 static constexpr uint8_t MICBIAS_DEFAULT = (1 << 3) | (1 << 1);
247 static constexpr uint8_t MIC_PGA_VOL_DEFAULT = 0x0;
248 static constexpr uint8_t MIC_PGAPI_L_DEFAULT = (1 << 7) | (1 << 6);
249 static constexpr uint8_t MIC_PGAPI_R_DEFAULT = (1 << 5) | (1 << 4);
250
251 // Timer / MCLK divider (page 3)
252 static constexpr uint8_t TIMER_MCLK_DIV_EN_EXT = (1 << 7);
253 static constexpr uint8_t TIMER_MCLK_DIV_MASK = 0x7F;
254 static uint8_t TIMER_MCLK_DIV_VAL(uint8_t val) {
255 return val & TIMER_MCLK_DIV_MASK;
256 }
257
259 static constexpr int CODEC_OUTPUT_VOLUME_MAX = 0;
260 static constexpr int CODEC_OUTPUT_VOLUME_MIN = (-78 * 2);
261
263 struct RateDivs {
264 uint32_t mclk;
265 uint32_t rate;
266 uint8_t pll_p;
267 uint8_t pll_j;
268 uint16_t pll_d;
269 uint8_t dosr;
270 uint8_t ndac;
271 uint8_t mdac;
272 uint8_t aosr;
273 uint8_t nadc;
274 uint8_t madc;
275 };
276
278
293 bool begin(uint32_t sample_rate, uint8_t bits) {
294 return begin(12000000, sample_rate, bits);
295 }
296
297 bool begin(uint32_t sample_rate, uint8_t bits, codec_mode_t mode,
298 i2s_format_t fmt, bool is_master, uint8_t channels) override {
299 (void)mode;
300 (void)fmt;
301 (void)is_master;
302 (void)channels;
303 return begin(sample_rate, bits);
304 }
305
306 bool begin(uint32_t mclk = 12000000, uint32_t sample_rate = 44100,
307 uint8_t word_size = 16, bool bclk_master = false) {
308 bool rc = true;
309
310 rc &= softReset();
311 rc &= configureClocks(mclk, sample_rate, word_size, bclk_master);
312 rc &= configureDai(word_size, bclk_master, false);
313 rc &= configureFilters(sample_rate);
314 rc &= configureInput();
315 rc &= configureOutput();
316
317 return rc;
318 }
319
322
324 bool configureDai(uint8_t word_size, bool bclk_master, bool wclk_master) {
325 uint8_t val = IF_CTRL_IFTYPE(IF_CTRL_IFTYPE_I2S);
326
327 if (bclk_master) val |= IF_CTRL_BCLK_OUT;
328 if (wclk_master) val |= IF_CTRL_WCLK_OUT;
329
330 switch (word_size) {
331 case 16:
333 break;
334 case 20:
336 break;
337 case 24:
339 break;
340 case 32:
342 break;
343 default:
344 return false;
345 }
346
347 return writePagedReg(IF_CTRL1_ADDR, val);
348 }
349
356 bool configureClocks(uint32_t mclk, uint32_t sample_rate,
357 uint8_t word_size, bool bclk_master) {
358 size_t count = 0;
359 const RateDivs* table = pllDivTable(count);
360 const RateDivs* entry = nullptr;
361
362 for (size_t i = 0; i < count; i++) {
363 if (table[i].rate == sample_rate && table[i].mclk == mclk) {
364 entry = &table[i];
365 break;
366 }
367 }
368 if (entry == nullptr) return false;
369
370 bool rc = true;
371 uint8_t p = entry->pll_p;
372 uint8_t r = 1;
373 uint8_t j = entry->pll_j;
374 uint16_t d = entry->pll_d;
375
376 /* set the PLL dividers */
377 rc &= writePagedReg(PLL_P_R_ADDR, (uint8_t)((1 << 7) | PLL_P(p) | PLL_R(r)));
378 rc &= writePagedReg(PLL_J_ADDR, j);
379 rc &= writePagedReg(PLL_D_MSB_ADDR, (uint8_t)(d >> 8));
380 rc &= writePagedReg(PLL_D_LSB_ADDR, (uint8_t)(d & 0xFF));
381
382 uint8_t madc = entry->madc;
383 uint8_t nadc = entry->nadc;
384 uint8_t aosr = entry->aosr;
385 uint8_t ndac = entry->ndac;
386 uint8_t mdac = entry->mdac;
387 uint8_t dosr = entry->dosr;
388
389 int bclk_div = 0;
390 if (bclk_master) {
391 bclk_div = (dosr * mdac) / (word_size * 2U); /* stereo */
392 if ((bclk_div * word_size * 2) != (dosr * mdac)) return false;
394 (uint8_t)(BCLK_DIV_POWER_UP | BCLK_DIV((uint8_t)bclk_div)));
395 }
396
397 /* Set clock gen mux and turn on PLL */
400
401 /* set NDAC, then MDAC, followed by OSR */
402 rc &= writePagedReg(NDAC_DIV_ADDR, (uint8_t)(NDAC_DIV(ndac) | NDAC_POWER_UP));
403 rc &= writePagedReg(MDAC_DIV_ADDR, (uint8_t)(MDAC_DIV(mdac) | MDAC_POWER_UP));
404 rc &= writePagedReg(OSR_MSB_ADDR, (uint8_t)((dosr >> 8) & OSR_MSB_MASK));
405 rc &= writePagedReg(OSR_LSB_ADDR, (uint8_t)(dosr & OSR_LSB_MASK));
406
407 /* set NADC, MADC, OSR */
408 rc &= writePagedReg(NADC_DIV_ADDR, (uint8_t)(NADC_DIV(nadc) | NADC_POWER_UP));
409 rc &= writePagedReg(MADC_DIV_ADDR, (uint8_t)(MADC_DIV(madc) | MADC_POWER_UP));
410 rc &= writePagedReg(AOSR_ADDR, aosr);
411
412 if (bclk_master) {
414 (uint8_t)(BCLK_DIV((uint8_t)bclk_div) | BCLK_DIV_POWER_UP));
415 }
416
417 /* calculate MCLK divider to get ~1MHz and setup the timer clock */
418 uint8_t mclk_div = (uint8_t)((mclk + 999999U) / 1000000U);
420 (uint8_t)(TIMER_MCLK_DIV_EN_EXT | TIMER_MCLK_DIV_VAL(mclk_div)));
421
422 return rc;
423 }
424
426 bool configureFilters(uint32_t sample_rate) {
427 uint8_t dac_proc_blk, adc_proc_blk;
428
429 if (sample_rate >= 192000) {
430 dac_proc_blk = AIC3110_PRB_P17_DECIMATION_C;
431 adc_proc_blk = AIC3110_PRB_R16_DECIMATION_C;
432 } else if (sample_rate >= 96000) {
433 dac_proc_blk = AIC3110_PRB_P7_DECIMATION_B;
434 adc_proc_blk = AIC3110_PRB_R10_DECIMATION_B;
435 } else {
436 dac_proc_blk = AIC3110_PRB_P1_DECIMATION_A;
437 adc_proc_blk = AIC3110_PRB_R4_DECIMATION_A;
438 }
439
440 bool rc = true;
441 rc &= writePagedReg(DAC_PROC_BLK_SEL_ADDR, dac_proc_blk);
442 rc &= writePagedReg(ADC_PROC_BLK_SEL_ADDR, adc_proc_blk);
443 return rc;
444 }
445
447 bool startOutput() {
448 bool rc = true;
451 return rc;
452 }
453
455 bool stopOutput() {
456 bool rc = true;
459 return rc;
460 }
461
470 bool rc = true;
471 uint8_t val = 0;
472
475
476 /* set common mode voltage to 1.65V (half of AVDD), AVDD is typically 3.3V */
478 val &= (uint8_t)~HEADPHONE_DRV_CM_MASK;
481
482 /* enable pop removal on power down/up */
485
486 /* route DAC output to mixer */
488
489 /* enable volume control on Headphone out and Speaker out */
494
495 /* unmute/mute headphone and speaker drivers depending on output_device */
500
501 /* power up headphone drivers */
503 if (hp) {
505 } else {
506 val = (uint8_t)((val & (uint8_t)~HEADPHONE_DRV_POWERUP) | HEADPHONE_DRV_RESERVED);
507 }
509
510 /* power up speaker drivers */
511 rc &= readPagedReg(SPEAKER_DRV_ADDR, val);
512 if (spk) {
514 } else {
515 val = (uint8_t)((val & (uint8_t)~SPEAKER_DRV_POWERUP) | SPEAKER_DRV_RESERVED);
516 }
518
519 return rc;
520 }
521
536
545 static const uint8_t vol_array[] = {107, 108, 110, 113, 116, 120,
546 125, 128, 132, 138, 144};
547 static constexpr size_t vol_array_len = sizeof(vol_array) / sizeof(vol_array[0]);
548
549 if (vol > CODEC_OUTPUT_VOLUME_MAX || vol < CODEC_OUTPUT_VOLUME_MIN) return false;
550
551 /* remove sign */
552 vol = -vol;
553
554 uint8_t vol_val;
555 if (vol > HPX_ANA_VOL_FLOOR) {
556 vol_val = HPX_ANA_VOL_FLOOR;
557 } else if (vol > HPX_ANA_VOL_LOW_THRESH) {
558 size_t vol_index = 0;
559 for (; vol_index < vol_array_len; vol_index++) {
560 if (vol_array[vol_index] >= (uint8_t)vol) break;
561 }
562 vol_val = (uint8_t)(HPX_ANA_VOL_LOW_THRESH + vol_index + 1);
563 } else {
564 vol_val = (uint8_t)vol;
565 }
566
567 bool rc = true;
568 switch (channel) {
582 return rc;
583 default:
584 return false;
585 }
586 }
587
590 uint8_t hp_val = (uint8_t)((mute ? 1U : 0U) << 2U) | HPX_DRV_RESERVED;
591 uint8_t sp_val = (uint8_t)((mute ? 1U : 0U) << 2U);
592
593 switch (channel) {
602 case AIC3110Channel::All: {
603 bool rc = true;
608 return rc;
609 }
610 default:
611 return false;
612 }
613 }
614
617 bool setVolume(int volume) override {
618 volume_percent = volume < 0 ? 0 : (volume > 100 ? 100 : volume);
619 int vol = CODEC_OUTPUT_VOLUME_MIN +
622 }
623
625 bool setMute(bool mute) override { return setOutputMute(mute, AIC3110Channel::All); }
626
629 (void)input_device;
630 this->output_device = output_device;
631 return true;
632 }
633
634 protected:
635 uint8_t current_page = 0xFF;
638
640 bool selectPage(uint8_t page) {
641 if (current_page == page) return true;
642 uint8_t reg = PAGE_CONTROL_ADDR;
643 if (!writeReg(reg, page)) return false;
644 current_page = page;
645 return true;
646 }
647
649 bool writePagedReg(RegAddr reg, uint8_t value) {
650 if (!selectPage(regAddrPage(reg))) return false;
651 return writeReg(regAddrReg(reg), value);
652 }
653
655 bool readPagedReg(RegAddr reg, uint8_t& value) {
656 if (!selectPage(regAddrPage(reg))) return false;
657 return readReg(regAddrReg(reg), value);
658 }
659
661 bool updatePagedReg(RegAddr reg, uint8_t mask, uint8_t value) {
662 uint8_t old = 0;
663 if (!readPagedReg(reg, old)) return false;
664 uint8_t updated = (old & ~mask) | (value & mask);
665 if (updated == old) return true;
666 return writePagedReg(reg, updated);
667 }
668
669 static constexpr uint8_t PAGE_CONTROL_ADDR = 0;
670
672 static const RateDivs* pllDivTable(size_t& count) {
673 static const RateDivs table[] = {
674 /* mclk rate p j d dosr ndac mdac aosr nadc madc */
675 {12000000, 8000, 1, 8, 1920, 128, 48, 2, 128, 48, 2},
676 {24000000, 8000, 2, 8, 1920, 128, 48, 2, 128, 48, 2},
677 {25000000, 8000, 2, 7, 8643, 128, 48, 2, 128, 48, 2},
678
679 {12000000, 11025, 1, 7, 5264, 128, 32, 2, 128, 32, 2},
680 {24000000, 11025, 2, 7, 5264, 128, 32, 2, 128, 32, 2},
681 {25000000, 11025, 2, 7, 2253, 128, 32, 2, 128, 32, 2},
682
683 {12000000, 16000, 1, 8, 1920, 128, 24, 2, 128, 24, 2},
684 {24000000, 16000, 2, 8, 1920, 128, 24, 2, 128, 24, 2},
685 {25000000, 16000, 2, 7, 8643, 128, 24, 2, 128, 24, 2},
686
687 {12000000, 22050, 1, 7, 5264, 128, 16, 2, 128, 16, 2},
688 {24000000, 22050, 2, 7, 5264, 128, 16, 2, 128, 16, 2},
689 {25000000, 22050, 2, 7, 2253, 128, 16, 2, 128, 16, 2},
690
691 {12000000, 32000, 1, 8, 1920, 128, 12, 2, 128, 12, 2},
692 {24000000, 32000, 2, 8, 1920, 128, 12, 2, 128, 12, 2},
693 {25000000, 32000, 2, 7, 8643, 128, 12, 2, 128, 12, 2},
694
695 {12000000, 44100, 1, 7, 5264, 128, 8, 2, 128, 8, 2},
696 {24000000, 44100, 2, 7, 5264, 128, 8, 2, 128, 8, 2},
697 {25000000, 44100, 2, 7, 2253, 128, 8, 2, 128, 8, 2},
698
699 {12000000, 48000, 1, 8, 1920, 128, 8, 2, 128, 8, 2},
700 {24000000, 48000, 2, 8, 1920, 128, 8, 2, 128, 8, 2},
701 {25000000, 48000, 2, 7, 8643, 128, 8, 2, 128, 8, 2},
702
703 {12000000, 88200, 1, 7, 5264, 64, 8, 2, 64, 8, 2},
704 {24000000, 88200, 2, 7, 5264, 64, 8, 2, 64, 8, 2},
705 {25000000, 88200, 2, 7, 2253, 64, 8, 2, 64, 8, 2},
706
707 {12000000, 96000, 1, 8, 1920, 64, 8, 2, 64, 8, 2},
708 {24000000, 96000, 2, 8, 1920, 64, 8, 2, 64, 8, 2},
709 {25000000, 96000, 2, 7, 8643, 64, 8, 2, 64, 8, 2},
710
711 {12000000, 176400, 1, 7, 5264, 32, 8, 2, 32, 8, 2},
712 {24000000, 176400, 2, 7, 5264, 32, 8, 2, 32, 8, 2},
713 {25000000, 176400, 2, 7, 2253, 32, 8, 2, 32, 8, 2},
714
715 {12000000, 192000, 1, 8, 1920, 32, 8, 2, 32, 8, 2},
716 {24000000, 192000, 2, 8, 1920, 32, 8, 2, 32, 8, 2},
717 {25000000, 192000, 2, 7, 8643, 32, 8, 2, 32, 8, 2},
718 };
719 count = sizeof(table) / sizeof(table[0]);
720 return table;
721 }
722};
723
724} // namespace audio_driver
Header only C++ driver for the TLV320AIC3110 audio codec.
Definition TLV320AIC3110.h:74
static constexpr RegAddr NDAC_DIV_ADDR
Definition TLV320AIC3110.h:94
static constexpr uint8_t MDAC_POWER_UP
Definition TLV320AIC3110.h:155
static constexpr RegAddr TIMER_MCLK_DIV_ADDR
Definition TLV320AIC3110.h:141
static const RateDivs * pllDivTable(size_t &count)
PLL/clock divider table indexed by (mclk, sample rate)
Definition TLV320AIC3110.h:672
static constexpr uint8_t NDAC_POWER_UP
Definition TLV320AIC3110.h:153
bool setOutputMute(bool mute, AIC3110Channel channel=AIC3110Channel::All)
Mute / unmute the headphone and/or speaker driver(s)
Definition TLV320AIC3110.h:589
static constexpr uint8_t MIC_FCTRL_DEFAULT
Definition TLV320AIC3110.h:244
static constexpr RegAddr SPR_ANA_VOL_CTRL_ADDR
Definition TLV320AIC3110.h:128
static constexpr RegAddr L_DIG_VOL_CTRL_ADDR
Definition TLV320AIC3110.h:108
bool setDevices(input_device_t input_device, output_device_t output_device) override
Stores the output device selection for use by configureOutput()
Definition TLV320AIC3110.h:628
bool begin(uint32_t sample_rate, uint8_t bits)
Initialize the codec: soft reset, configure the PLL/clock dividers for the given MCLK and sample rate...
Definition TLV320AIC3110.h:293
static uint8_t MDAC_DIV(uint8_t val)
Definition TLV320AIC3110.h:165
static constexpr RegAddr SPL_ANA_VOL_CTRL_ADDR
Definition TLV320AIC3110.h:127
bool setOutputVolume(int vol, AIC3110Channel channel=AIC3110Channel::All)
Set the output (headphone / speaker) volume.
Definition TLV320AIC3110.h:544
static constexpr uint8_t OSR_MSB_MASK
Definition TLV320AIC3110.h:157
static constexpr uint8_t IF_CTRL_IFTYPE_DSP
Definition TLV320AIC3110.h:172
static constexpr RegAddr BCLK_DIV_ADDR
Definition TLV320AIC3110.h:102
static constexpr uint8_t HPX_DRV_UNMUTE
Definition TLV320AIC3110.h:233
static constexpr RegAddr ADC_PROC_BLK_SEL_ADDR
Definition TLV320AIC3110.h:105
static constexpr uint8_t SOFT_RESET_ASSERT
Definition TLV320AIC3110.h:144
static constexpr uint8_t MIC_CCTRL_DEFAULT
Definition TLV320AIC3110.h:245
static constexpr uint8_t SPX_ANA_VOL_FLOOR
Definition TLV320AIC3110.h:230
static constexpr RegAddr BEEP_LEN_MSB_ADDR
Definition TLV320AIC3110.h:112
static uint8_t BCLK_DIV(uint8_t val)
Definition TLV320AIC3110.h:168
static constexpr RegAddr HPL_ANA_VOL_CTRL_ADDR
Definition TLV320AIC3110.h:125
static constexpr uint8_t PLL_R_MASK
Definition TLV320AIC3110.h:149
static constexpr RegAddr DATA_PATH_SETUP_ADDR
Definition TLV320AIC3110.h:106
static uint8_t NADC_DIV(uint8_t val)
Definition TLV320AIC3110.h:166
bool softReset()
Soft reset of the codec.
Definition TLV320AIC3110.h:321
static uint8_t HEADPHONE_DRV_CM(uint8_t val)
Definition TLV320AIC3110.h:199
static constexpr uint8_t SPEAKER_DRV_RESERVED
Definition TLV320AIC3110.h:240
static uint8_t IF_CTRL_IFTYPE(uint8_t val)
Definition TLV320AIC3110.h:175
static constexpr uint8_t IF_CTRL_IFTYPE_RJF
Definition TLV320AIC3110.h:173
static uint8_t TIMER_MCLK_DIV_VAL(uint8_t val)
Definition TLV320AIC3110.h:254
static constexpr RegAddr MIC_CCTRL_ADDR
Definition TLV320AIC3110.h:118
static constexpr uint8_t HPX_ANA_VOL_MAX
Definition TLV320AIC3110.h:217
static constexpr uint8_t HPX_ANA_VOL_LOW_THRESH
Definition TLV320AIC3110.h:220
static constexpr uint8_t OUTPUT_ROUTING_HPR
Definition TLV320AIC3110.h:208
static constexpr uint8_t MDAC_DIV_MASK
Definition TLV320AIC3110.h:156
static constexpr RegAddr MIC_FCTRL_ADDR
Definition TLV320AIC3110.h:117
static constexpr uint8_t NDAC_DIV_MASK
Definition TLV320AIC3110.h:154
static constexpr RegAddr PLL_P_R_ADDR
Definition TLV320AIC3110.h:90
static constexpr RegAddr SOFT_RESET_ADDR
Definition TLV320AIC3110.h:88
bool configureInput()
Configure the microphone input path: power up the ADC, set the microphone bias, unmute the input,...
Definition TLV320AIC3110.h:527
bool setMute(bool mute) override
Mutes/unmutes all outputs.
Definition TLV320AIC3110.h:625
static uint8_t HPX_ANA_VOL(uint8_t val)
Definition TLV320AIC3110.h:214
static constexpr uint8_t IF_CTRL_WLEN_32
Definition TLV320AIC3110.h:179
static constexpr uint8_t HPX_ANA_VOL_ENABLE
Definition TLV320AIC3110.h:212
static constexpr uint8_t OUTPUT_ROUTING_MIXER
Definition TLV320AIC3110.h:209
static constexpr uint8_t regAddrReg(RegAddr addr)
Definition TLV320AIC3110.h:83
output_device_t output_device
Output device selection set via setDevices(), used by configureOutput()
Definition TLV320AIC3110.h:637
static constexpr uint8_t NADC_DIV_MASK
Definition TLV320AIC3110.h:160
static constexpr RegAddr BEEP_LEN_MIB_ADDR
Definition TLV320AIC3110.h:113
bool begin(uint32_t mclk=12000000, uint32_t sample_rate=44100, uint8_t word_size=16, bool bclk_master=false)
Definition TLV320AIC3110.h:306
static constexpr RegAddr HP_OUT_POP_RM_ADDR
Definition TLV320AIC3110.h:123
bool configureOutput()
Configure the headphone and/or speaker output paths (depending on the output device selected via setD...
Definition TLV320AIC3110.h:469
static constexpr uint8_t VOL_CTRL_MUTE_DEFAULT
Definition TLV320AIC3110.h:192
static constexpr uint8_t MIC_PGAPI_L_DEFAULT
Definition TLV320AIC3110.h:248
static constexpr uint8_t HPX_DRV_RESERVED
Definition TLV320AIC3110.h:234
static constexpr RegAddr HPR_DRV_GAIN_CTRL_ADDR
Definition TLV320AIC3110.h:130
static constexpr int CODEC_OUTPUT_VOLUME_MIN
Definition TLV320AIC3110.h:260
uint8_t current_page
Definition TLV320AIC3110.h:635
static constexpr RegAddr MIC_ICM_ADDR
Definition TLV320AIC3110.h:138
static constexpr uint8_t OUTPUT_ROUTING_HPL
Definition TLV320AIC3110.h:207
static constexpr RegAddr MIC_PGAPI_ADDR
Definition TLV320AIC3110.h:136
static constexpr RegAddr CLOCK_GEN_MUX_ADDR
Definition TLV320AIC3110.h:89
static constexpr RegAddr PLL_D_LSB_ADDR
Definition TLV320AIC3110.h:93
static constexpr uint8_t MADC_DIV_MASK
Definition TLV320AIC3110.h:162
static constexpr int CODEC_OUTPUT_VOLUME_MAX
Output volume range, in 0.5dB steps (-39dB .. 0dB)
Definition TLV320AIC3110.h:259
static constexpr uint8_t VOL_CTRL_UNMUTE_DEFAULT
Definition TLV320AIC3110.h:191
static constexpr RegAddr MIC_BIAS_ADDR
Definition TLV320AIC3110.h:134
static constexpr uint8_t TIMER_MCLK_DIV_EN_EXT
Definition TLV320AIC3110.h:252
static constexpr uint8_t HP_OUT_POP_RM_ENABLE
Definition TLV320AIC3110.h:205
TLV320AIC3110()
Definition TLV320AIC3110.h:277
static constexpr RegAddr regAddr(uint8_t page, uint8_t reg)
Definition TLV320AIC3110.h:77
bool startOutput()
Power up the DAC channels and unmute them.
Definition TLV320AIC3110.h:447
static constexpr uint8_t SPX_ANA_VOL_ENABLE
Definition TLV320AIC3110.h:223
static constexpr uint8_t MICBIAS_DEFAULT
Definition TLV320AIC3110.h:246
static constexpr RegAddr DRC_CTRL1_ADDR
Definition TLV320AIC3110.h:109
static constexpr RegAddr MIC_PGAMI_ADDR
Definition TLV320AIC3110.h:137
static constexpr uint8_t IF_CTRL_WLEN_24
Definition TLV320AIC3110.h:178
static constexpr RegAddr NADC_DIV_ADDR
Definition TLV320AIC3110.h:98
static constexpr RegAddr SPR_DRV_GAIN_CTRL_ADDR
Definition TLV320AIC3110.h:132
bool configureDai(uint8_t word_size, bool bclk_master, bool wclk_master)
Configure the digital audio interface (I2S) word size and clock direction.
Definition TLV320AIC3110.h:324
static constexpr RegAddr OVF_FLAG_ADDR
Definition TLV320AIC3110.h:103
static constexpr uint8_t BEEP_GEN_EN_BEEP
Definition TLV320AIC3110.h:194
static constexpr RegAddr SPEAKER_DRV_ADDR
Definition TLV320AIC3110.h:122
bool updatePagedReg(RegAddr reg, uint8_t mask, uint8_t value)
Read-Modify-Write of a register on the given page.
Definition TLV320AIC3110.h:661
static constexpr uint8_t regAddrPage(RegAddr addr)
Definition TLV320AIC3110.h:80
static constexpr uint8_t MIC_ADC_POWERUP
Definition TLV320AIC3110.h:243
static constexpr RegAddr HEADPHONE_DRV_ADDR
Definition TLV320AIC3110.h:121
static constexpr uint8_t BCLK_DIV_POWER_UP
Definition TLV320AIC3110.h:185
static constexpr uint8_t PLL_POWER_UP
Definition TLV320AIC3110.h:147
static constexpr uint8_t PLL_P_MASK
Definition TLV320AIC3110.h:148
bool readPagedReg(RegAddr reg, uint8_t &value)
Reads a register on the given page.
Definition TLV320AIC3110.h:655
static uint8_t SPX_ANA_VOL(uint8_t val)
Definition TLV320AIC3110.h:225
static constexpr uint8_t IF_CTRL_WLEN_20
Definition TLV320AIC3110.h:177
static constexpr RegAddr BEEP_LEN_LSB_ADDR
Definition TLV320AIC3110.h:114
static constexpr uint8_t SPX_ANA_VOL_DEFAULT
Definition TLV320AIC3110.h:228
static constexpr RegAddr DAC_PROC_BLK_SEL_ADDR
Definition TLV320AIC3110.h:104
static constexpr RegAddr IF_CTRL1_ADDR
Definition TLV320AIC3110.h:101
static constexpr uint8_t HEADPHONE_DRV_CM_MASK
Definition TLV320AIC3110.h:198
static constexpr RegAddr OUTPUT_ROUTING_ADDR
Definition TLV320AIC3110.h:124
static constexpr uint8_t HEADPHONE_DRV_POWERUP
Definition TLV320AIC3110.h:197
static uint8_t PLL_P(uint8_t val)
Definition TLV320AIC3110.h:150
static constexpr uint8_t IF_CTRL_BCLK_OUT
Definition TLV320AIC3110.h:181
bool begin(uint32_t sample_rate, uint8_t bits, codec_mode_t mode, i2s_format_t fmt, bool is_master, uint8_t channels) override
Initializes the codec.
Definition TLV320AIC3110.h:297
static constexpr RegAddr MDAC_DIV_ADDR
Definition TLV320AIC3110.h:95
static constexpr uint8_t OSR_LSB_MASK
Definition TLV320AIC3110.h:158
static constexpr RegAddr HPR_ANA_VOL_CTRL_ADDR
Definition TLV320AIC3110.h:126
static constexpr uint8_t CLOCK_GEN_MUX_DEFAULT
Definition TLV320AIC3110.h:145
static constexpr uint8_t SPX_ANA_VOL_MASK
Definition TLV320AIC3110.h:224
bool selectPage(uint8_t page)
Selects the active register page (writes register 0 of page 0)
Definition TLV320AIC3110.h:640
static constexpr RegAddr OSR_MSB_ADDR
Definition TLV320AIC3110.h:96
static constexpr uint8_t IF_CTRL_WCLK_OUT
Definition TLV320AIC3110.h:182
static constexpr uint8_t HPX_ANA_VOL_DEFAULT
Definition TLV320AIC3110.h:218
static uint8_t MADC_DIV(uint8_t val)
Definition TLV320AIC3110.h:167
static constexpr RegAddr HPL_DRV_GAIN_CTRL_ADDR
Definition TLV320AIC3110.h:129
static uint8_t IF_CTRL_WLEN(uint8_t val)
Definition TLV320AIC3110.h:180
static constexpr uint8_t IF_CTRL_IFTYPE_LJF
Definition TLV320AIC3110.h:174
static constexpr RegAddr L_BEEP_GEN_ADDR
Definition TLV320AIC3110.h:110
static constexpr RegAddr MADC_DIV_ADDR
Definition TLV320AIC3110.h:99
static constexpr RegAddr R_BEEP_GEN_ADDR
Definition TLV320AIC3110.h:111
static constexpr uint8_t TIMER_MCLK_DIV_MASK
Definition TLV320AIC3110.h:253
static constexpr RegAddr MIC_ADC_CTRL_ADDR
Definition TLV320AIC3110.h:116
static constexpr RegAddr MIC_ADC_FLAG_ADDR
Definition TLV320AIC3110.h:115
static constexpr uint8_t DAC_LR_POWERUP_DEFAULT
Definition TLV320AIC3110.h:187
static constexpr uint8_t HEADPHONE_DRV_LINEOUT
Definition TLV320AIC3110.h:203
bool configureClocks(uint32_t mclk, uint32_t sample_rate, uint8_t word_size, bool bclk_master)
Configure the PLL and the NDAC/MDAC/NADC/MADC/(B)OSR clock dividers for the given MCLK and sample rat...
Definition TLV320AIC3110.h:356
tlv320aic3110_detail::RegAddr RegAddr
Definition TLV320AIC3110.h:76
bool stopOutput()
Mute the DAC channels and power them down.
Definition TLV320AIC3110.h:455
static constexpr uint8_t HEADPHONE_DRV_RESERVED
Definition TLV320AIC3110.h:202
bool setVolume(int volume) override
Definition TLV320AIC3110.h:617
static constexpr RegAddr AOSR_ADDR
Definition TLV320AIC3110.h:100
static constexpr RegAddr VOL_CTRL_ADDR
Definition TLV320AIC3110.h:107
static constexpr uint8_t MIC_PGAPI_R_DEFAULT
Definition TLV320AIC3110.h:249
static constexpr uint8_t IF_CTRL_IFTYPE_I2S
Definition TLV320AIC3110.h:171
static constexpr uint8_t DAC_LR_POWERDN_DEFAULT
Definition TLV320AIC3110.h:189
static constexpr uint8_t MIC_PGA_VOL_DEFAULT
Definition TLV320AIC3110.h:247
static constexpr RegAddr HEADPHONE_DRV_CTRL_ADDR
Definition TLV320AIC3110.h:133
static constexpr uint8_t MADC_POWER_UP
Definition TLV320AIC3110.h:161
static constexpr uint8_t HPX_ANA_VOL_MASK
Definition TLV320AIC3110.h:213
static constexpr RegAddr SPL_DRV_GAIN_CTRL_ADDR
Definition TLV320AIC3110.h:131
static constexpr uint8_t SPX_DRV_RESERVED
Definition TLV320AIC3110.h:236
static constexpr uint8_t PAGE_CONTROL_ADDR
Definition TLV320AIC3110.h:669
bool writePagedReg(RegAddr reg, uint8_t value)
Writes a register on the given page.
Definition TLV320AIC3110.h:649
static constexpr uint8_t SPEAKER_DRV_POWERUP
Definition TLV320AIC3110.h:239
static uint8_t PLL_R(uint8_t val)
Definition TLV320AIC3110.h:151
static constexpr uint8_t IF_CTRL_DOUT_HIGH_Z
Definition TLV320AIC3110.h:183
static constexpr uint8_t NADC_POWER_UP
Definition TLV320AIC3110.h:159
static constexpr uint8_t HPX_ANA_VOL_MIN
Definition TLV320AIC3110.h:219
static constexpr RegAddr MIC_PGA_ADDR
Definition TLV320AIC3110.h:135
static constexpr RegAddr OSR_LSB_ADDR
Definition TLV320AIC3110.h:97
static uint8_t NDAC_DIV(uint8_t val)
Definition TLV320AIC3110.h:164
static constexpr uint8_t HPX_ANA_VOL_FLOOR
Definition TLV320AIC3110.h:221
static constexpr uint8_t SPX_DRV_UNMUTE
Definition TLV320AIC3110.h:235
static constexpr RegAddr PLL_D_MSB_ADDR
Definition TLV320AIC3110.h:92
static constexpr uint8_t SPX_ANA_VOL_LOW_THRESH
Definition TLV320AIC3110.h:229
static constexpr uint8_t IF_CTRL_WLEN_16
Definition TLV320AIC3110.h:176
bool configureFilters(uint32_t sample_rate)
Select the DAC/ADC decimation filter (processing block) based on sample rate.
Definition TLV320AIC3110.h:426
static constexpr RegAddr PLL_J_ADDR
Definition TLV320AIC3110.h:91
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
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
constexpr uint8_t regAddrPage(RegAddr addr)
Definition TLV320AIC3110.h:61
constexpr uint8_t regAddrReg(RegAddr addr)
Definition TLV320AIC3110.h:62
uint16_t RegAddr
Definition TLV320AIC3110.h:57
constexpr RegAddr regAddr(uint8_t page, uint8_t reg)
Definition TLV320AIC3110.h:58
Namespace for audio driver components.
Definition AudioBoard.h:5
input_device_t
Definition DriverCommon.h:170
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
AIC3110CmVoltage
Headphone/Speaker common mode output voltage.
Definition TLV320AIC3110.h:42
@ AIC3110_CM_VOLTAGE_1P5
Definition TLV320AIC3110.h:44
@ AIC3110_CM_VOLTAGE_1P8
Definition TLV320AIC3110.h:46
@ AIC3110_CM_VOLTAGE_1P65
Definition TLV320AIC3110.h:45
@ AIC3110_CM_VOLTAGE_1P35
Definition TLV320AIC3110.h:43
AIC3110DacProcBlock
DAC decimation filter / processing block selection.
Definition TLV320AIC3110.h:28
@ AIC3110_PRB_P17_DECIMATION_C
Definition TLV320AIC3110.h:31
@ AIC3110_PRB_P1_DECIMATION_A
Definition TLV320AIC3110.h:29
@ AIC3110_PRB_P7_DECIMATION_B
Definition TLV320AIC3110.h:30
i2s_format_t
Definition DriverCommon.h:250
AIC3110AdcProcBlock
ADC decimation filter / processing block selection.
Definition TLV320AIC3110.h:35
@ AIC3110_PRB_R16_DECIMATION_C
Definition TLV320AIC3110.h:38
@ AIC3110_PRB_R4_DECIMATION_A
Definition TLV320AIC3110.h:36
@ AIC3110_PRB_R10_DECIMATION_B
Definition TLV320AIC3110.h:37
AIC3110Channel
Logical audio channels.
Definition TLV320AIC3110.h:19
PLL/clock divider settings for a given MCLK/sample-rate combination.
Definition TLV320AIC3110.h:263
uint8_t pll_j
Definition TLV320AIC3110.h:267
uint8_t dosr
Definition TLV320AIC3110.h:269
uint32_t mclk
Definition TLV320AIC3110.h:264
uint8_t madc
Definition TLV320AIC3110.h:274
uint8_t mdac
Definition TLV320AIC3110.h:271
uint16_t pll_d
Definition TLV320AIC3110.h:268
uint8_t ndac
Definition TLV320AIC3110.h:270
uint8_t aosr
Definition TLV320AIC3110.h:272
uint8_t nadc
Definition TLV320AIC3110.h:273
uint32_t rate
Definition TLV320AIC3110.h:265
uint8_t pll_p
Definition TLV320AIC3110.h:266