arduino-audio-driver
Loading...
Searching...
No Matches
TAS6422DAC.h
Go to the documentation of this file.
1
10#pragma once
11
13
14namespace audio_driver {
15
17enum class TAS6422Channel {
20 All,
21};
22
25 Play = 0,
26 Hiz = 1,
27 Mute = 2,
28 DcLoad = 3,
29};
30
37 I2S = 4,
38 Left = 5,
39 Dsp = 6,
40};
41
50 public:
51 // ---- Register addresses ----
74
75 // ---- Mode Control Register bits ----
76 static constexpr uint8_t MODE_CTRL_RESET = (1u << 7);
77 static constexpr uint8_t MODE_CTRL_PBTL_CH12 = (1u << 4);
78 static constexpr uint8_t MODE_CTRL_CH1_LO_MODE = (1u << 3);
79 static constexpr uint8_t MODE_CTRL_CH2_LO_MODE = (1u << 2);
80
81 // ---- Misc Control 1 Register bits ----
82 static constexpr uint8_t MISC_CTRL_1_HPF_BYPASS = (1u << 7);
83 static constexpr uint8_t MISC_CTRL_1_OTW_CONTROL_MASK = (0x3u << 5);
84 static constexpr uint8_t MISC_CTRL_1_OC_CONTROL_MASK = (1u << 4);
85 static constexpr uint8_t MISC_CTRL_1_VOLUME_RATE_MASK = (0x3u << 2);
86 static constexpr uint8_t MISC_CTRL_1_GAIN_MASK = 0x3u;
87
88 // ---- Misc Control 2 Register bits ----
89 static constexpr uint8_t MISC_CTRL_2_PWM_FREQUENCY_MASK = (0x7u << 4);
90 static constexpr uint8_t MISC_CTRL_2_PWM_FREQUENCY_8_FS = 0;
91 static constexpr uint8_t MISC_CTRL_2_PWM_FREQUENCY_10_FS = 1;
92 static constexpr uint8_t MISC_CTRL_2_PWM_FREQUENCY_38_FS = 5;
93 static constexpr uint8_t MISC_CTRL_2_PWM_FREQUENCY_44_FS = 6;
94 static constexpr uint8_t MISC_CTRL_2_PWM_FREQUENCY_48_FS = 7;
95 static constexpr uint8_t MISC_CTRL_2_SDM_OSR = (1u << 2);
96 static constexpr uint8_t MISC_CTRL_2_OUTPUT_PHASE_MASK = 0x3u;
97
98 // ---- Serial Audio-Port Control Register bits ----
99 static constexpr uint8_t SAP_CTRL_INPUT_SAMPLING_RATE_MASK = (0x3u << 6);
100 static constexpr uint8_t SAP_CTRL_INPUT_SAMPLING_RATE_44_1_KHZ = 0;
101 static constexpr uint8_t SAP_CTRL_INPUT_SAMPLING_RATE_48_KHZ = 1;
102 static constexpr uint8_t SAP_CTRL_INPUT_SAMPLING_RATE_96_KHZ = 2;
103 static constexpr uint8_t SAP_CTRL_TDM_SLOT_SELECT = (1u << 5);
104 static constexpr uint8_t SAP_CTRL_TDM_SLOT_SIZE = (1u << 4);
105 static constexpr uint8_t SAP_CTRL_TDM_SLOT_SELECT_2 = (1u << 3);
106 static constexpr uint8_t SAP_CTRL_INPUT_FORMAT_MASK = 0x7u;
107
108 // ---- Channel State Control Register bits ----
109 static constexpr uint8_t CH_STATE_CTRL_CH1_STATE_CTRL_MASK = (0x3u << 6);
110 static constexpr uint8_t CH_STATE_CTRL_CH2_STATE_CTRL_MASK = (0x3u << 4);
111
112 // ---- Channel Volume Control Register ----
113 static constexpr uint8_t CH_VOLUME_CTRL_VOLUME_MASK = 0xFFu;
114
115 // ---- Output volume limits (in 0.5dB steps, signed) ----
116 static constexpr int OUTPUT_VOLUME_MAX = (24 * 2);
117 static constexpr int OUTPUT_VOLUME_MIN = (-100 * 2);
118
119 TAS6422DAC() { i2c_addr = 0x6C; }
120
135 bool begin(uint32_t sample_rate, uint8_t bits) {
136 (void)bits;
137 return begin(sample_rate);
138 }
139
140 bool begin(uint32_t sample_rate, uint8_t bits, codec_mode_t mode,
141 i2s_format_t fmt, bool is_master, uint8_t channels) override {
142 (void)mode;
143 (void)fmt;
144 (void)is_master;
145 (void)channels;
146 return begin(sample_rate, bits);
147 }
148
149 bool begin(uint32_t sample_rate = 44100) {
150 bool rc = true;
151 rc &= softReset();
152 rc &= configureDai(sample_rate);
153 rc &= configureOutput();
155 return rc;
156 }
157
159 bool softReset() {
160 uint8_t val = 0;
161 if (!readReg(MODE_CTRL_ADDR, val)) return false;
162 val |= MODE_CTRL_RESET;
163 return writeReg(MODE_CTRL_ADDR, val);
164 }
165
172 bool configureDai(uint32_t sample_rate) {
173 uint8_t val = 0;
174 if (!readReg(SAP_CTRL_ADDR, val)) return false;
175
176 val &= (uint8_t)~SAP_CTRL_INPUT_FORMAT_MASK;
177 val |= (uint8_t)TAS6422InputFormat::I2S;
178
179 val &= (uint8_t)~SAP_CTRL_INPUT_SAMPLING_RATE_MASK;
180 switch (sample_rate) {
181 case 44100:
183 break;
184 case 48000:
186 break;
187 case 96000:
189 break;
190 default:
191 return false;
192 }
193
194 return writeReg(SAP_CTRL_ADDR, val);
195 }
196
208 bool rc = true;
209 uint8_t val = 0;
210
213 }
214
215 rc &= readReg(MISC_CTRL_1_ADDR, val);
216 val &= (uint8_t)~MISC_CTRL_1_OC_CONTROL_MASK;
217 rc &= writeReg(MISC_CTRL_1_ADDR, val);
218
219 rc &= readReg(MISC_CTRL_2_ADDR, val);
220 val &= (uint8_t)~MISC_CTRL_2_PWM_FREQUENCY_MASK;
221 val |= (uint8_t)(MISC_CTRL_2_PWM_FREQUENCY_10_FS << 4);
222 rc &= writeReg(MISC_CTRL_2_ADDR, val);
223
224 return rc;
225 }
226
229 uint8_t val = 0;
230 if (!readReg(CH_STATE_CTRL_ADDR, val)) return false;
231
232 switch (channel) {
234 val &= (uint8_t)~CH_STATE_CTRL_CH1_STATE_CTRL_MASK;
235 val |= (uint8_t)((uint8_t)state << 6);
236 break;
238 val &= (uint8_t)~CH_STATE_CTRL_CH2_STATE_CTRL_MASK;
239 val |= (uint8_t)((uint8_t)state << 4);
240 break;
242 val &= (uint8_t)~(CH_STATE_CTRL_CH1_STATE_CTRL_MASK |
244 val |= (uint8_t)((uint8_t)state << 6) | (uint8_t)((uint8_t)state << 4);
245 break;
246 default:
247 return false;
248 }
249
250 return writeReg(CH_STATE_CTRL_ADDR, val);
251 }
252
257
262
264 bool setMute(bool mute, TAS6422Channel channel = TAS6422Channel::All) {
265 return setChannelState(channel, mute ? TAS6422ChannelState::Mute
267 }
268
271 (void)input_device;
272 this->output_device = output_device;
273 return true;
274 }
275
284 if (volume > OUTPUT_VOLUME_MAX || volume < OUTPUT_VOLUME_MIN) return false;
285
286 uint8_t vol_val = (uint8_t)(volume + 0xCF);
287
288 switch (channel) {
290 return writeReg(CH1_VOLUME_CTRL_ADDR, vol_val);
292 return writeReg(CH2_VOLUME_CTRL_ADDR, vol_val);
293 case TAS6422Channel::All: {
294 bool rc = true;
295 rc &= writeReg(CH1_VOLUME_CTRL_ADDR, vol_val);
296 rc &= writeReg(CH2_VOLUME_CTRL_ADDR, vol_val);
297 return rc;
298 }
299 default:
300 return false;
301 }
302 }
303
306 bool setVolume(int volume) override {
307 volume_percent = volume < 0 ? 0 : (volume > 100 ? 100 : volume);
308 int vol = OUTPUT_VOLUME_MIN +
311 }
312
315 bool clearFaults() {
316 uint8_t val = 0;
317 if (!readReg(MISC_CTRL_3_ADDR, val)) return false;
318 val |= (1u << 7); // MISC_CTRL_3_CLEAR_FAULT
319 return writeReg(MISC_CTRL_3_ADDR, val);
320 }
321
323 bool getChannelFaults(uint8_t& value) { return readReg(CH_FAULTS_ADDR, value); }
324
326 bool getGlobalFaults1(uint8_t& value) { return readReg(GLOBAL_FAULTS_1_ADDR, value); }
327
329 bool getGlobalFaults2(uint8_t& value) { return readReg(GLOBAL_FAULTS_2_ADDR, value); }
330
332 bool getWarnings(uint8_t& value) { return readReg(WARNINGS_ADDR, value); }
333
334 protected:
337};
338
339} // namespace audio_driver
Header only C++ driver for the TAS6422 2-channel Class-D amplifier.
Definition TAS6422DAC.h:49
bool getGlobalFaults1(uint8_t &value)
Read the global faults 1 register (clock / supply voltage faults)
Definition TAS6422DAC.h:326
static constexpr uint8_t CH_STATE_CTRL_CH1_STATE_CTRL_MASK
Definition TAS6422DAC.h:109
static constexpr int OUTPUT_VOLUME_MAX
Definition TAS6422DAC.h:116
bool setDevices(input_device_t input_device, output_device_t output_device) override
Stores the output device selection for use by configureOutput()
Definition TAS6422DAC.h:270
bool begin(uint32_t sample_rate, uint8_t bits)
Initialize the codec: soft reset, configure the I2S input format/sample rate and apply default output...
Definition TAS6422DAC.h:135
static constexpr uint8_t SAP_CTRL_INPUT_SAMPLING_RATE_44_1_KHZ
Definition TAS6422DAC.h:100
bool softReset()
Trigger a soft reset (sets the RESET bit in MODE_CTRL)
Definition TAS6422DAC.h:159
bool setMute(bool mute, TAS6422Channel channel=TAS6422Channel::All)
Mute / unmute the given channel(s)
Definition TAS6422DAC.h:264
bool clearFaults()
Definition TAS6422DAC.h:315
bool stop(TAS6422Channel channel=TAS6422Channel::All)
Mute the given channel(s)
Definition TAS6422DAC.h:259
static constexpr int OUTPUT_VOLUME_MIN
Definition TAS6422DAC.h:117
static constexpr uint8_t MISC_CTRL_1_GAIN_MASK
Definition TAS6422DAC.h:86
static constexpr uint8_t MODE_CTRL_PBTL_CH12
Definition TAS6422DAC.h:77
bool getGlobalFaults2(uint8_t &value)
Read the global faults 2 register (thermal shutdown faults)
Definition TAS6422DAC.h:329
static constexpr uint8_t MISC_CTRL_1_VOLUME_RATE_MASK
Definition TAS6422DAC.h:85
static constexpr uint8_t MODE_CTRL_RESET
Definition TAS6422DAC.h:76
static constexpr uint8_t SAP_CTRL_TDM_SLOT_SELECT
Definition TAS6422DAC.h:103
static constexpr uint8_t MISC_CTRL_1_OC_CONTROL_MASK
Definition TAS6422DAC.h:84
static constexpr uint8_t MISC_CTRL_2_PWM_FREQUENCY_8_FS
Definition TAS6422DAC.h:90
output_device_t output_device
Output device selection set via setDevices(), used by configureOutput()
Definition TAS6422DAC.h:336
static constexpr uint8_t SAP_CTRL_INPUT_FORMAT_MASK
Definition TAS6422DAC.h:106
bool configureOutput()
Apply default output settings: overcurrent level = 1, PWM frequency = 10 fs (reduced from default to ...
Definition TAS6422DAC.h:207
static constexpr uint8_t MISC_CTRL_2_SDM_OSR
Definition TAS6422DAC.h:95
static constexpr uint8_t MISC_CTRL_2_PWM_FREQUENCY_44_FS
Definition TAS6422DAC.h:93
static constexpr uint8_t SAP_CTRL_INPUT_SAMPLING_RATE_48_KHZ
Definition TAS6422DAC.h:101
Reg
Definition TAS6422DAC.h:52
@ DC_LDG_REPORT_1_ADDR
Definition TAS6422DAC.h:62
@ WARNINGS_ADDR
Definition TAS6422DAC.h:67
@ MISC_CTRL_3_ADDR
Definition TAS6422DAC.h:69
@ CH_STATE_CTRL_ADDR
Definition TAS6422DAC.h:57
@ MISC_CTRL_4_ADDR
Definition TAS6422DAC.h:71
@ CH2_VOLUME_CTRL_ADDR
Definition TAS6422DAC.h:59
@ GLOBAL_FAULTS_1_ADDR
Definition TAS6422DAC.h:65
@ GLOBAL_FAULTS_2_ADDR
Definition TAS6422DAC.h:66
@ MISC_CTRL_2_ADDR
Definition TAS6422DAC.h:55
@ MODE_CTRL_ADDR
Definition TAS6422DAC.h:53
@ DC_LDG_CTRL_1_ADDR
Definition TAS6422DAC.h:60
@ MISC_CTRL_1_ADDR
Definition TAS6422DAC.h:54
@ PIN_CTRL_ADDR
Definition TAS6422DAC.h:68
@ CH_FAULTS_ADDR
Definition TAS6422DAC.h:64
@ SAP_CTRL_ADDR
Definition TAS6422DAC.h:56
@ DC_LDG_CTRL_2_ADDR
Definition TAS6422DAC.h:61
@ DC_LDG_REPORT_3_ADDR
Definition TAS6422DAC.h:63
@ MISC_CTRL_5_ADDR
Definition TAS6422DAC.h:72
@ ILIMIT_STATUS_ADDR
Definition TAS6422DAC.h:70
@ CH1_VOLUME_CTRL_ADDR
Definition TAS6422DAC.h:58
static constexpr uint8_t SAP_CTRL_TDM_SLOT_SELECT_2
Definition TAS6422DAC.h:105
static constexpr uint8_t SAP_CTRL_INPUT_SAMPLING_RATE_MASK
Definition TAS6422DAC.h:99
static constexpr uint8_t CH_STATE_CTRL_CH2_STATE_CTRL_MASK
Definition TAS6422DAC.h:110
bool configureDai(uint32_t sample_rate)
Configure the serial audio port: I2S input format and input sampling rate.
Definition TAS6422DAC.h:172
static constexpr uint8_t MISC_CTRL_2_PWM_FREQUENCY_MASK
Definition TAS6422DAC.h:89
bool begin(uint32_t sample_rate=44100)
Definition TAS6422DAC.h:149
static constexpr uint8_t MISC_CTRL_2_PWM_FREQUENCY_48_FS
Definition TAS6422DAC.h:94
static constexpr uint8_t SAP_CTRL_TDM_SLOT_SIZE
Definition TAS6422DAC.h:104
static constexpr uint8_t MISC_CTRL_1_HPF_BYPASS
Definition TAS6422DAC.h:82
static constexpr uint8_t SAP_CTRL_INPUT_SAMPLING_RATE_96_KHZ
Definition TAS6422DAC.h:102
static constexpr uint8_t MISC_CTRL_1_OTW_CONTROL_MASK
Definition TAS6422DAC.h:83
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 TAS6422DAC.h:140
bool setChannelState(TAS6422Channel channel, TAS6422ChannelState state)
Set the channel state (Play, Hiz, Mute or DcLoad) for the given channel(s)
Definition TAS6422DAC.h:228
bool getWarnings(uint8_t &value)
Read the warnings register (POR / over-temperature warnings)
Definition TAS6422DAC.h:332
static constexpr uint8_t CH_VOLUME_CTRL_VOLUME_MASK
Definition TAS6422DAC.h:113
static constexpr uint8_t MISC_CTRL_2_PWM_FREQUENCY_38_FS
Definition TAS6422DAC.h:92
static constexpr uint8_t MISC_CTRL_2_OUTPUT_PHASE_MASK
Definition TAS6422DAC.h:96
bool start(TAS6422Channel channel=TAS6422Channel::All)
Unmute (set to Play state) the given channel(s)
Definition TAS6422DAC.h:254
bool setOutputVolume(int volume, TAS6422Channel channel=TAS6422Channel::All)
Set the output volume in 0.5dB steps.
Definition TAS6422DAC.h:283
static constexpr uint8_t MISC_CTRL_2_PWM_FREQUENCY_10_FS
Definition TAS6422DAC.h:91
bool setVolume(int volume) override
Definition TAS6422DAC.h:306
static constexpr uint8_t MODE_CTRL_CH2_LO_MODE
Definition TAS6422DAC.h:79
TAS6422DAC()
Definition TAS6422DAC.h:119
bool getChannelFaults(uint8_t &value)
Read the channel faults register (over-current / DC detection)
Definition TAS6422DAC.h:323
static constexpr uint8_t MODE_CTRL_CH1_LO_MODE
Definition TAS6422DAC.h:78
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
Namespace for audio driver components.
Definition AudioBoard.h:5
TAS6422InputFormat
Serial audio port input format (SAP_CTRL register)
Definition TAS6422DAC.h:32
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_NONE
Definition DriverCommon.h:187
TAS6422ChannelState
Channel state (CH_STATE_CTRL register)
Definition TAS6422DAC.h:24
i2s_format_t
Definition DriverCommon.h:250
TAS6422Channel
Output channel selection.
Definition TAS6422DAC.h:17