arduino-audio-driver
Loading...
Searching...
No Matches
CS42448.h
Go to the documentation of this file.
1/*
2 * MIT License
3 *
4 * Copyright (c) 2024 Phil Schatzmann
5 *
6 * Permission is hereby granted for use on all products, in which case,
7 * it is free of charge, to any person obtaining a copy of this software and
8 * associated documentation files (the "Software"), to deal in the Software
9 * without restriction, including without limitation the rights to use, copy,
10 * modify, merge, publish, distribute, sublicense, and/or sell copies of the
11 * Software, and to permit persons to whom the Software is furnished to do so,
12 * subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24 *
25 */
26#pragma once
28#include "DriverCommon.h"
29#include "Platforms/API_I2C.h"
30
31namespace audio_driver {
32
38class CS42448 {
39 public:
40 static constexpr uint8_t CS42448_Chip_ID = 0x01;
41 static constexpr uint8_t CS42448_Power_Control = 0x02;
42 static constexpr uint8_t CS42448_Functional_Mode = 0x03;
43 static constexpr uint8_t CS42448_Interface_Formats = 0x04;
44 static constexpr uint8_t CS42448_ADC_Control_DAC_DeEmphasis = 0x05;
45 static constexpr uint8_t CS42448_Transition_Control = 0x06;
46 static constexpr uint8_t CS42448_DAC_Channel_Mute = 0x07;
47 static constexpr uint8_t CS42448_AOUT1_Volume_Control = 0x08;
48 static constexpr uint8_t CS42448_AOUT2_Volume_Control = 0x09;
49 static constexpr uint8_t CS42448_AOUT3_Volume_Control = 0x0A;
50 static constexpr uint8_t CS42448_AOUT4_Volume_Control = 0x0B;
51 static constexpr uint8_t CS42448_AOUT5_Volume_Control = 0x0C;
52 static constexpr uint8_t CS42448_AOUT6_Volume_Control = 0x0D;
53 static constexpr uint8_t CS42448_AOUT7_Volume_Control = 0x0E;
54 static constexpr uint8_t CS42448_AOUT8_Volume_Control = 0x0F;
55 static constexpr uint8_t CS42448_DAC_Channel_Invert = 0x10;
56 static constexpr uint8_t CS42448_AIN1_Volume_Control = 0x11;
57 static constexpr uint8_t CS42448_AIN2_Volume_Control = 0x12;
58 static constexpr uint8_t CS42448_AIN3_Volume_Control = 0x13;
59 static constexpr uint8_t CS42448_AIN4_Volume_Control = 0x14;
60 static constexpr uint8_t CS42448_AIN5_Volume_Control = 0x15;
61 static constexpr uint8_t CS42448_AIN6_Volume_Control = 0x16;
62 static constexpr uint8_t CS42448_ADC_Channel_Invert = 0x17;
63 static constexpr uint8_t CS42448_Status_Control = 0x18;
64 static constexpr uint8_t CS42448_Status = 0x19;
65 static constexpr uint8_t CS42448_Status_Mask = 0x1A;
66 static constexpr uint8_t CS42448_MUTEC_Pin_Control = 0x1B;
67 static constexpr uint8_t CS42448_PDN = (1 << 0);
68 static constexpr uint8_t CS42448_PDN_DAC1 = (1 << 1);
69 static constexpr uint8_t CS42448_PDN_DAC2 = (1 << 2);
70 static constexpr uint8_t CS42448_PDN_DAC3 = (1 << 3);
71 static constexpr uint8_t CS42448_PDN_DAC4 = (1 << 4);
72 static constexpr uint8_t CS42448_PDN_ADC1 = (1 << 5);
73 static constexpr uint8_t CS42448_PDN_ADC2 = (1 << 6);
74 static constexpr uint8_t CS42448_PDN_ADC3 = (1 << 7);
75 static constexpr uint8_t CS42448_DAC_FM_SLAVE = (3 << 6);
76 static constexpr uint8_t CS42448_ADC_FM_SLAVE = (3 << 4);
77 static constexpr uint8_t CS42448_DAC_DIF_I2S = (1 << 3);
78 static constexpr uint8_t CS42448_ADC_DIF_I2S = (1 << 0);
79 static constexpr uint8_t CS42448_DAC_DIF_TDM = (3 << 4);
80 static constexpr uint8_t CS42448_ADC_DIF_TDM = (3 << 1);
81
82 enum class Format {
84 I2S = 1,
87 OneLine1 = 4,
88 OneLine2 = 5,
89 TDM = 6
90 };
91 enum class SoftRamp {
96 };
97 enum class InterruptControl {
98 ActiveHigh = 0,
100 OpenDrain,
101 };
108 enum class MasterFrequency {
109 MasterSingleSpeed = 0, //
111 MasterQuadSpeed = 4,
112 };
113
114 // 4.9 Recommended Power-Up Sequence
115 // 1. Hold RST low until the power supply and clocks are stable. In this
116 // state,
117 // the control port is reset to its default settings and VQ will remain
118 // low.
119 // 2. Bring RST high. The device will initially be in a low power state
120 // with VQ
121 // low. All features will default as described in the "Register Quick
122 // Reference" on page 40.
123 // 3. Perform a write operation to the Power Control register ("Power
124 // Control
125 // (Address 02h)" on page 43) to set bit 0 to a '1'b. This will place
126 // the device in a power down state.
127 // 4. Load the desired register settings while keeping the PDN bit set to
128 // '1'b.
129 // 5. Mute all DACs. Muting the DACs suppresses any noise associated with
130 // the
131 // CODEC's first initialization after power is applied.
132 // 6. Set the PDN bit in the power control register to '0'b. VQ will ramp
133 // to
134 // approximately VA/2 according to the Popguard specification in section
135 // "Popguard" on page 29.
136 // 7. Following approximately 2000 LRCK cycles, the device is initialized
137 // and
138 // ready for normal operation.
139 // 8. After the CODEC is initialized, wait ~90 LRCK cycles (~1.9 ms @48
140 // kHz) and
141 // then un-mute the DACs.
142 // 9. Normal operation begins.
143 bool begin(codec_config_t codecCfg, i2c_bus_handle_t handle,
144 int i2cAddress = -1) {
145 this->codec_config = codecCfg;
146 this->i2c = handle;
147 if (i2cAddress > 0) {
148 this->i2c_address = i2cAddress;
149 }
150
151 if (is_active) {
152 setMuteADC(true);
153 setMuteDAC(true);
154 }
155 setPowerAll(false);
156
157 // slave mode, MCLK 25.6 MHz max
158 if (!setSampleRate(codec_config.i2s.rate)) return false;
159 // TDM mode
160 if (!setFormat()) return false;
161 // single ended ADC
162 if (!setADCSingleEnded(true)) return false;
163 // soft vol control
165 // all outputs mute
166 setMuteDAC(true);
167
168 // power on requested devices
170 return is_active;
171 }
172
174 bool end() {
175 setMuteADC(true);
176 setMuteDAC(true);
177 is_active = false;
178 return setPowerDevices(false);
179 }
180
189 bool setSampleRate(int rate) {
190 FunctionalMode mode;
191 MasterFrequency master_freq;
192
193 switch (codec_config.i2s.mode) {
194 case MODE_SLAVE:
196 break;
197
198 case MODE_MASTER:
199 if (rate > 4000 && rate <= 50000) {
201 } else if (rate > 50000 && rate <= 100000) {
203 } else if (rate > 100000 && rate <= 200000) {
205 } else {
206 return false;
207 }
208 break;
209 }
210
211 if (rate > 4000 && rate <= 50000) {
213 } else if (rate > 50000 && rate <= 100000) {
215 } else if (rate > 100000 && rate <= 200000) {
217 } else {
218 return false;
219 }
220
221 uint8_t reg_value = 0;
222 reg_value = (uint16_t)mode << 6 | (uint16_t)mode << 4 |
223 (uint16_t)master_freq << 1 | 0;
224
225 if (!writeReg(CS42448_Functional_Mode, reg_value)) return false;
226
227 return true;
228 }
229 // line starts at 0
230 bool setMuteDAC(uint8_t line, bool mute) {
231 uint8_t mute_reg_value;
232 if (line >= 8) return false;
233 if (!readReg(CS42448_DAC_Channel_Mute, &mute_reg_value)) return false;
234 setBit(mute_reg_value, line, mute);
235 if (!writeReg(CS42448_DAC_Channel_Mute, mute_reg_value)) return false;
236 return true;
237 }
238
239 bool setMuteDAC(bool mute) {
240 uint8_t reg_value = mute ? 0xFF : 0;
241 freeze(true);
242 if (!writeReg(CS42448_DAC_Channel_Mute, reg_value)) return false;
243 freeze(false);
244 return true;
245 }
246
247 bool setMuteADC(bool mute) {
248 uint8_t transition_ctl;
249 if (!readReg(CS42448_Transition_Control, &transition_ctl)) return false;
250 setBit(transition_ctl, 3, mute);
251 if (!writeReg(CS42448_Transition_Control, transition_ctl)) return false;
252 return true;
253 }
254
255 bool setMute(bool mute) { return setMuteADC(mute) && setMuteDAC(mute); }
256
257 bool setVolumeDAC(uint8_t vol) {
258 freeze(true);
259 for (uint8_t j = 0; j < 8; j++) {
260 setVolumeDAC(j, vol);
261 }
262 freeze(false);
263 return true;
264 }
265
268 bool setVolumeDAC(uint8_t channel, uint8_t vol) {
269 if (channel > 7) return false;
270 if (!writeReg(CS42448_AOUT1_Volume_Control + channel, vol)) return false;
271 return true;
272 }
273
274 int getVolumeDAC(uint8_t channel) {
275 uint8_t vol;
276 if (channel > 7) return false;
277 if (!readReg(CS42448_AOUT1_Volume_Control + channel, &vol)) return -1;
278 return vol;
279 }
280
282 bool setVolumeADC(int8_t volume) {
283 freeze(true);
284 for (uint8_t j = 0; j < 6; j++) {
285 setVolumeADC(j, volume);
286 }
287 freeze(false);
288 return true;
289 }
290
291 bool setVolumeADC(uint8_t channel, int8_t volume) {
292 if (channel > 5) return false;
293 if (!writeReg(CS42448_AIN1_Volume_Control + channel, volume)) return false;
294 return true;
295 }
296
297 int8_t getVolumeADC(uint8_t channel) {
298 int8_t vol;
299 if (channel > 5) return false;
300 if (!readReg(CS42448_AIN1_Volume_Control + channel, (uint8_t*)&vol))
301 return -1;
302 return vol;
303 }
304
306 bool setPowerDevices(bool active) {
307 bool ok_dac = true;
308 bool ok_adc = true;
309 switch (codec_config.input_device) {
310 case ADC_INPUT_NONE:
311 break;
312 case ADC_INPUT_LINE1:
313 ok_dac = setPowerADC(1, active);
314 break;
315 case ADC_INPUT_LINE2:
316 ok_dac = setPowerADC(2, active);
317 break;
318 case ADC_INPUT_LINE3:
319 ok_dac = setPowerADC(3, active);
320 break;
321 case ADC_INPUT_ALL:
322 ok_dac = setPowerADC(active);
323 break;
324 default:
325 ok_dac = false;
326 break;
327 }
328 switch (codec_config.output_device) {
329 case DAC_OUTPUT_NONE:
330 break;
331 case DAC_OUTPUT_LINE1:
332 ok_adc = setPowerDAC(1, active);
333 break;
334 case DAC_OUTPUT_LINE2:
335 ok_adc = setPowerDAC(2, active);
336 break;
337 case DAC_OUTPUT_ALL:
338 ok_adc = setPowerDAC(active);
339 break;
340 default:
341 ok_adc = false;
342 break;
343 }
344 return ok_adc && ok_dac;
345 }
346
348 bool setPowerAll(bool active) {
349 return setPowerADC(active) && setPowerDAC(active) && setPower(active);
350 }
351
353 bool setPower(bool active) {
354 uint8_t power;
355 if (!readReg(CS42448_Power_Control, &power)) return false;
356 setBit(power, 0, active);
357 if (!writeReg(CS42448_Power_Control, power)) return false;
358 return true;
359 }
360
362 bool setPowerDAC(int dac, bool active) {
363 uint8_t power;
364 if (dac >= 4) return false;
365 if (!readReg(CS42448_Power_Control, &power)) return false;
366 setBit(power, dac, active);
367 if (!writeReg(CS42448_Power_Control, power)) return false;
368 return true;
369 }
370
371 bool setPowerDAC(bool active) {
372 uint8_t power;
373 if (!readReg(CS42448_Power_Control, &power)) return false;
374 setBit(power, 1, active);
375 setBit(power, 2, active);
376 setBit(power, 3, active);
377 setBit(power, 4, active);
378 if (!writeReg(CS42448_Power_Control, power)) return false;
379 return true;
380 }
381
383 bool setPowerADC(int adc, bool active) {
384 uint8_t power;
385 if (adc > 3) return false;
386 if (!readReg(CS42448_Power_Control, &power)) return false;
387 setBit(power, adc + 4, active);
388 if (!writeReg(CS42448_Power_Control, power)) return false;
389 return true;
390 }
391
392 bool setPowerADC(bool active) {
393 uint8_t power;
394 if (!readReg(CS42448_Power_Control, &power)) return false;
395 setBit(power, 5, active);
396 setBit(power, 6, active);
397 setBit(power, 7, active);
398 if (!writeReg(CS42448_Power_Control, power)) return false;
399 return true;
400 }
401
403 bool freeze(bool freeze) {
404 uint8_t fmt;
405 if (!readReg(CS42448_Interface_Formats, &fmt)) return false;
406 setBit(fmt, 7, freeze);
407 if (!writeReg(CS42448_Interface_Formats, fmt)) return false;
408 return true;
409 }
410
412 uint8_t fmt_reg_value;
413 if (!readReg(CS42448_Interface_Formats, &fmt_reg_value)) return false;
414 fmt_reg_value =
415 (uint16_t)fmt | ((uint16_t)fmt << 3) | ((uint16_t)fmt_reg_value & 0x80);
416 if (!writeReg(CS42448_Interface_Formats, fmt_reg_value)) return false;
417 return true;
418 }
419
421 uint8_t transition_ctl;
422 if (!readReg(CS42448_Transition_Control, &transition_ctl)) return false;
423 transition_ctl = (uint16_t)softRamp | ((uint16_t)softRamp << 5) |
424 (transition_ctl & 0x9F);
425 if (!writeReg(CS42448_Transition_Control, transition_ctl)) return false;
426 return true;
427 }
428
429 bool setAutoMute(bool autoMute) {
430 uint8_t transition_ctl;
431 if (!readReg(CS42448_Transition_Control, &transition_ctl)) return false;
432 setBit(transition_ctl, 4, autoMute);
433 if (!writeReg(CS42448_Transition_Control, transition_ctl)) return false;
434 return true;
435 }
436
437 bool setDACInvert(uint8_t channel, int invert) {
438 uint8_t invert_reg_value;
439 if (!readReg(CS42448_DAC_Channel_Invert, &invert_reg_value)) return false;
440 setBit(invert_reg_value, channel, invert);
441 if (!writeReg(CS42448_DAC_Channel_Invert, invert_reg_value)) return false;
442 return true;
443 }
444
445 bool setDACInvert(int invert) {
446 uint8_t invert_reg_value = invert ? 0xFF : 0;
447 if (!writeReg(CS42448_DAC_Channel_Invert, invert_reg_value)) return false;
448 return true;
449 }
450
451 bool setADCInvert(uint8_t channel, int invert) {
452 uint8_t invert_reg_value;
453 if (!readReg(CS42448_ADC_Channel_Invert, &invert_reg_value)) return false;
454 setBit(invert_reg_value, channel, invert);
455 if (!writeReg(CS42448_ADC_Channel_Invert, invert_reg_value)) return false;
456 return true;
457 }
458
459 bool setADCInvert(int invert) {
460 uint8_t invert_reg_value = invert ? 0xFF : 0;
461 if (!writeReg(CS42448_ADC_Channel_Invert, invert_reg_value)) return false;
462 return true;
463 }
464
466 uint8_t control_reg_value;
467 if (!readReg(CS42448_Status_Control, &control_reg_value)) return false;
468 control_reg_value = ((uint16_t)value << 2) | (control_reg_value & 0xC);
469 if (!writeReg(CS42448_Status_Control, control_reg_value)) return false;
470 return true;
471 }
472
473 bool getInterruptStatus(uint8_t& status) {
474 if (!readReg(CS42448_Status, &status)) return false;
475 status &= CS42448_Status_Mask;
476 return true;
477 }
478
480 uint8_t control_reg_value;
481 if (!readReg(CS42448_ADC_Control_DAC_DeEmphasis, &control_reg_value))
482 return false;
483 setBit(control_reg_value, 7, freeze);
484 if (!writeReg(CS42448_ADC_Control_DAC_DeEmphasis, control_reg_value))
485 return false;
486 return true;
487 }
488
490 uint8_t control_reg_value;
491 if (!readReg(CS42448_ADC_Control_DAC_DeEmphasis, &control_reg_value))
492 return false;
493 setBit(control_reg_value, 6, freeze);
494 if (!writeReg(CS42448_ADC_Control_DAC_DeEmphasis, control_reg_value))
495 return false;
496 return true;
497 }
498
500 uint8_t control_reg_value;
501 if (!readReg(CS42448_ADC_Control_DAC_DeEmphasis, &control_reg_value))
502 return false;
503 setBit(control_reg_value, 6, on);
504 if (!writeReg(CS42448_ADC_Control_DAC_DeEmphasis, control_reg_value))
505 return false;
506 return true;
507 }
508
509 bool setADCSingleEnded(int adc, bool on) {
510 uint8_t control_reg_value;
511 if (adc > 3) return false;
512 if (adc < 1) return false;
513 if (!readReg(CS42448_ADC_Control_DAC_DeEmphasis, &control_reg_value))
514 return false;
515 setBit(control_reg_value, 5 - adc, on);
516 if (!writeReg(CS42448_ADC_Control_DAC_DeEmphasis, control_reg_value))
517 return false;
518 return true;
519 }
520
521 bool setADCSingleEnded(bool on) {
522 uint8_t control_reg_value;
523 if (!readReg(CS42448_ADC_Control_DAC_DeEmphasis, &control_reg_value))
524 return false;
525 setBit(control_reg_value, 2, on);
526 setBit(control_reg_value, 3, on);
527 setBit(control_reg_value, 4, on);
528 if (!writeReg(CS42448_ADC_Control_DAC_DeEmphasis, control_reg_value))
529 return false;
530 return true;
531 }
532
533 uint8_t getChipID() {
534 uint8_t result = -1;
535 readReg(CS42448_Chip_ID, &result);
536 return result >> 4;
537 }
538
539 uint8_t getChipRevision() {
540 uint8_t result = -1;
541 readReg(CS42448_Chip_ID, &result);
542 return result & 0xF;
543 }
544
545 protected:
548 int i2c_address = 0x48;
549 bool is_active = false;
550
552 bool setFormat() {
554 return setFormat(Format::TDM);
555 } else {
556 switch (codec_config.i2s.fmt) {
557 case I2S_NORMAL:
558 return setFormat(Format::I2S);
559 case I2S_LEFT:
561 case I2S_RIGHT:
562 Format fmt;
565 } else if (codec_config.i2s.bits == BIT_LENGTH_24BITS) {
567 } else
568 return false;
569 return setFormat(fmt);
570 default:
571 return false;
572 }
573 }
574 }
575
576 bool writeReg(uint8_t reg, uint8_t value) { return writeReg(reg, &value, 1); }
577
578 bool writeReg(uint8_t reg, uint8_t* value, int len) {
579 return i2c_bus_write_bytes(i2c, i2c_address, &reg, 1, value, len) ==
580 RESULT_OK;
581 }
582
583 bool readReg(uint8_t reg, uint8_t* outdata, int datalen = 1) {
584 return i2c_bus_read_bytes(i2c, i2c_address, &reg, 1, outdata, datalen) ==
585 RESULT_OK;
586 }
587
588 inline uint8_t setBit(uint8_t number, uint8_t n, bool x) {
589 return (number & ~((uint8_t)1 << n)) | ((uint8_t)x << n);
590 }
591};
592
593} // namespace audio_driver
#define RESULT_OK
Definition DriverCommon.h:74
The CS42448 CODEC from Cirrus Logic provides six multi-bit ana- log-to-digital and eight multi-bit di...
Definition CS42448.h:38
uint8_t setBit(uint8_t number, uint8_t n, bool x)
Definition CS42448.h:588
int getVolumeDAC(uint8_t channel)
Definition CS42448.h:274
bool setInterrupControl(InterruptControl value)
Definition CS42448.h:465
MasterFrequency
Definition CS42448.h:108
bool setDACInvert(uint8_t channel, int invert)
Definition CS42448.h:437
static constexpr uint8_t CS42448_PDN_ADC2
Definition CS42448.h:73
bool setADCInvert(uint8_t channel, int invert)
Definition CS42448.h:451
SoftRamp
Definition CS42448.h:91
static constexpr uint8_t CS42448_ADC_DIF_TDM
Definition CS42448.h:80
bool freeze(bool freeze)
All mute and volume values are activated on unfreeze.
Definition CS42448.h:403
bool setMuteDAC(bool mute)
Definition CS42448.h:239
static constexpr uint8_t CS42448_Power_Control
Definition CS42448.h:41
bool setPowerDAC(int dac, bool active)
Power on individual DAC from 1 to 4.
Definition CS42448.h:362
static constexpr uint8_t CS42448_AIN6_Volume_Control
Definition CS42448.h:61
bool setFormat()
Set I2S format based on codec_config.
Definition CS42448.h:552
bool setADCHighPassFilterFreeze3(bool freeze)
Definition CS42448.h:489
static constexpr uint8_t CS42448_AOUT2_Volume_Control
Definition CS42448.h:48
uint8_t getChipID()
Definition CS42448.h:533
static constexpr uint8_t CS42448_ADC_FM_SLAVE
Definition CS42448.h:76
static constexpr uint8_t CS42448_Chip_ID
Definition CS42448.h:40
static constexpr uint8_t CS42448_Status
Definition CS42448.h:64
bool is_active
Definition CS42448.h:549
static constexpr uint8_t CS42448_AIN4_Volume_Control
Definition CS42448.h:59
static constexpr uint8_t CS42448_DAC_Channel_Invert
Definition CS42448.h:55
static constexpr uint8_t CS42448_AOUT4_Volume_Control
Definition CS42448.h:50
static constexpr uint8_t CS42448_Transition_Control
Definition CS42448.h:45
bool setAutoMute(bool autoMute)
Definition CS42448.h:429
static constexpr uint8_t CS42448_AIN5_Volume_Control
Definition CS42448.h:60
bool setDACDeEmphasisControl(bool on)
Definition CS42448.h:499
bool setADCHighPassFilterFreeze12(bool freeze)
Definition CS42448.h:479
static constexpr uint8_t CS42448_AOUT5_Volume_Control
Definition CS42448.h:51
static constexpr uint8_t CS42448_PDN
Definition CS42448.h:67
static constexpr uint8_t CS42448_ADC_Control_DAC_DeEmphasis
Definition CS42448.h:44
static constexpr uint8_t CS42448_PDN_DAC4
Definition CS42448.h:71
bool begin(codec_config_t codecCfg, i2c_bus_handle_t handle, int i2cAddress=-1)
Definition CS42448.h:143
static constexpr uint8_t CS42448_MUTEC_Pin_Control
Definition CS42448.h:66
bool setVolumeDAC(uint8_t vol)
Definition CS42448.h:257
uint8_t getChipRevision()
Definition CS42448.h:539
static constexpr uint8_t CS42448_ADC_DIF_I2S
Definition CS42448.h:78
bool setPowerADC(int adc, bool active)
Power on individual ADC from 1 to 3.
Definition CS42448.h:383
bool setMuteDAC(uint8_t line, bool mute)
Definition CS42448.h:230
bool setADCInvert(int invert)
Definition CS42448.h:459
bool writeReg(uint8_t reg, uint8_t *value, int len)
Definition CS42448.h:578
bool getInterruptStatus(uint8_t &status)
Definition CS42448.h:473
static constexpr uint8_t CS42448_DAC_FM_SLAVE
Definition CS42448.h:75
static constexpr uint8_t CS42448_DAC_Channel_Mute
Definition CS42448.h:46
i2c_bus_handle_t i2c
Definition CS42448.h:547
static constexpr uint8_t CS42448_DAC_DIF_TDM
Definition CS42448.h:79
static constexpr uint8_t CS42448_PDN_DAC3
Definition CS42448.h:70
static constexpr uint8_t CS42448_AOUT7_Volume_Control
Definition CS42448.h:53
FunctionalMode
Definition CS42448.h:102
static constexpr uint8_t CS42448_AOUT1_Volume_Control
Definition CS42448.h:47
bool setPower(bool active)
Device Power.
Definition CS42448.h:353
bool setPowerAll(bool active)
Power all ADC and DAC and Device.
Definition CS42448.h:348
static constexpr uint8_t CS42448_AOUT8_Volume_Control
Definition CS42448.h:54
bool setMuteADC(bool mute)
Definition CS42448.h:247
bool readReg(uint8_t reg, uint8_t *outdata, int datalen=1)
Definition CS42448.h:583
static constexpr uint8_t CS42448_AIN1_Volume_Control
Definition CS42448.h:56
bool setPowerADC(bool active)
Definition CS42448.h:392
int i2c_address
Definition CS42448.h:548
bool setFormat(CS42448::Format fmt)
Definition CS42448.h:411
static constexpr uint8_t CS42448_Status_Control
Definition CS42448.h:63
bool setMute(bool mute)
Definition CS42448.h:255
static constexpr uint8_t CS42448_PDN_ADC3
Definition CS42448.h:74
static constexpr uint8_t CS42448_AOUT3_Volume_Control
Definition CS42448.h:49
static constexpr uint8_t CS42448_AIN3_Volume_Control
Definition CS42448.h:58
bool setPowerDAC(bool active)
Definition CS42448.h:371
Format
Definition CS42448.h:82
static constexpr uint8_t CS42448_Status_Mask
Definition CS42448.h:65
static constexpr uint8_t CS42448_DAC_DIF_I2S
Definition CS42448.h:77
bool setPowerDevices(bool active)
Power only the selected devices.
Definition CS42448.h:306
bool setADCSingleEnded(bool on)
Definition CS42448.h:521
bool setDACInvert(int invert)
Definition CS42448.h:445
static constexpr uint8_t CS42448_AIN2_Volume_Control
Definition CS42448.h:57
static constexpr uint8_t CS42448_AOUT6_Volume_Control
Definition CS42448.h:52
static constexpr uint8_t CS42448_Functional_Mode
Definition CS42448.h:42
static constexpr uint8_t CS42448_PDN_ADC1
Definition CS42448.h:72
bool writeReg(uint8_t reg, uint8_t value)
Definition CS42448.h:576
bool setVolumeADC(int8_t volume)
Set volume in 0.5 dB increments. -128 .. 127 is -64dB .. 24dB; 0 = 0dB.
Definition CS42448.h:282
bool setSoftRampControl(CS42448::SoftRamp softRamp)
Definition CS42448.h:420
static constexpr uint8_t CS42448_PDN_DAC1
Definition CS42448.h:68
bool setADCSingleEnded(int adc, bool on)
Definition CS42448.h:509
codec_config_t codec_config
Definition CS42448.h:546
static constexpr uint8_t CS42448_ADC_Channel_Invert
Definition CS42448.h:62
static constexpr uint8_t CS42448_PDN_DAC2
Definition CS42448.h:69
bool setVolumeDAC(uint8_t channel, uint8_t vol)
Definition CS42448.h:268
InterruptControl
Definition CS42448.h:97
bool end()
Mute ADC and DAC and then power down.
Definition CS42448.h:174
static constexpr uint8_t CS42448_Interface_Formats
Definition CS42448.h:43
int8_t getVolumeADC(uint8_t channel)
Definition CS42448.h:297
bool setSampleRate(int rate)
Single-Speed Mode (SSM) supports input sample rates up to 50 kHz and uses a 128x oversampling ratio....
Definition CS42448.h:189
bool setVolumeADC(uint8_t channel, int8_t volume)
Definition CS42448.h:291
Namespace for audio driver components.
Definition AudioBoard.h:5
@ ADC_INPUT_ALL
Definition DriverCommon.h:175
@ ADC_INPUT_NONE
Definition DriverCommon.h:171
@ ADC_INPUT_LINE1
Definition DriverCommon.h:172
@ ADC_INPUT_LINE3
Definition DriverCommon.h:174
@ ADC_INPUT_LINE2
Definition DriverCommon.h:173
@ BIT_LENGTH_24BITS
Definition DriverCommon.h:240
@ BIT_LENGTH_16BITS
Definition DriverCommon.h:237
@ DAC_OUTPUT_LINE1
Definition DriverCommon.h:188
@ DAC_OUTPUT_ALL
Definition DriverCommon.h:190
@ DAC_OUTPUT_NONE
Definition DriverCommon.h:187
@ DAC_OUTPUT_LINE2
Definition DriverCommon.h:189
@ I2S_RIGHT
Definition DriverCommon.h:253
@ I2S_LEFT
Definition DriverCommon.h:252
@ I2S_NORMAL
Definition DriverCommon.h:251
@ MODE_MASTER
Definition DriverCommon.h:205
@ MODE_SLAVE
Definition DriverCommon.h:204
@ SIGNAL_TDM
Definition DriverCommon.h:266
void * i2c_bus_handle_t
Definition DriverCommon.h:155
i2s_format_t fmt
Definition DriverCommon.h:386
samplerate_t rate
Definition DriverCommon.h:387
i2s_master_slave_t mode
Definition DriverCommon.h:385
signal_t signal_type
Definition DriverCommon.h:390
sample_bits_t bits
Definition DriverCommon.h:388
Top-level codec configuration passed to the audio driver at init.
Definition DriverCommon.h:397
output_device_t output_device
Definition DriverCommon.h:399
I2SDefinition i2s
Definition DriverCommon.h:400
input_device_t input_device
Definition DriverCommon.h:398