arduino-audio-driver
Loading...
Searching...
No Matches
AW88298.h
Go to the documentation of this file.
1
8#pragma once
9
11
12namespace audio_driver {
13
15enum class AW88298Mode {
16 I2S = 4,
17 LeftJustified = 5,
19};
20
22enum class AW88298WordSize {
23 Bits16,
24 Bits20,
25 Bits24,
26 Bits32,
27};
28
41 public:
42 // ---- Register addresses ----
43 enum Reg : uint8_t {
44 REG_ID = 0x00,
45 REG_SYSST = 0x01,
46 REG_SYSINT = 0x02,
55 };
56
57 // ---- SYSCTRL bits ----
58 static constexpr uint16_t SYSCTRL_PWDN = (1U << 0);
59 static constexpr uint16_t SYSCTRL_AMPPD = (1U << 1);
60 static constexpr uint16_t SYSCTRL_I2SEN = (1U << 6);
61
62 // ---- SYSCTRL2 bits ----
63 static constexpr uint16_t SYSCTRL2_HMUTE = (1U << 4);
64
65 // ---- I2SCTRL fields ----
66 static constexpr uint16_t I2SCTRL_I2SSR_MASK = (0x0FU << 0);
67 static constexpr uint16_t I2SCTRL_I2SBCK_MASK = (0x03U << 4);
68 static constexpr uint16_t I2SCTRL_I2SFS_MASK = (0x03U << 6);
69 static constexpr uint16_t I2SCTRL_I2SMD_MASK = (0x07U << 8);
70
71 // ---- HAGCCFG4 fields ----
72 static constexpr uint16_t HAGCCFG4_VOL_MASK = (0xFFU << 8);
73
75 static constexpr uint16_t ID_SOFTRESET = 0x55AA;
76
77 static constexpr int VOLUME_DB_MAX = 0;
78 static constexpr int VOLUME_DB_MIN = -96;
79
81 AW88298() { i2c_addr = 0x36; }
82
93 bool begin(uint32_t sample_rate, uint8_t bits) {
94 return begin(AW88298Mode::I2S, bits, sample_rate);
95 }
96
97 bool begin(uint32_t sample_rate, uint8_t bits, codec_mode_t mode,
98 i2s_format_t fmt, bool is_master, uint8_t channels) override {
99 (void)mode;
100 (void)fmt;
101 (void)is_master;
102 (void)channels;
103 return begin(sample_rate, bits);
104 }
105
106 bool begin(AW88298Mode mode = AW88298Mode::I2S, uint8_t word_size = 16,
107 uint32_t sample_rate = 44100) {
108 bool rc = true;
109
110 rc &= softReset();
111 delayMs(50);
112
113 // Power up: clear AMPPD and PWDN
115 // Unmute
117
118 rc &= setFormat(mode, word_size, sample_rate);
119
120 return rc;
121 }
122
124 bool softReset() { return updateReg16(REG_ID, 0xFFFF, ID_SOFTRESET); }
125
131 bool setFormat(AW88298Mode mode, uint8_t word_size, uint32_t sample_rate) {
132 uint16_t fs_code, bck_code;
133 if (!wordSizeCodes(word_size, fs_code, bck_code)) return false;
134
135 uint16_t rate_code;
136 if (!sampleRateCode(sample_rate, rate_code)) return false;
137
138 bool rc = true;
139 // Enable I2S interface, clear power down
142
143 uint16_t mask = I2SCTRL_I2SMD_MASK | I2SCTRL_I2SFS_MASK |
145 uint16_t value = (((uint16_t)mode << 8) & I2SCTRL_I2SMD_MASK) |
146 ((fs_code << 6) & I2SCTRL_I2SFS_MASK) |
147 ((bck_code << 4) & I2SCTRL_I2SBCK_MASK) |
149 rc &= updateReg16(REG_I2SCTRL, mask, value);
150
151 return rc;
152 }
153
156
158 bool stopOutput() {
159 return updateReg16(REG_SYSCTRL, SYSCTRL_AMPPD, 0xFFFF);
160 }
161
163 bool setMute(bool mute) override {
165 mute ? SYSCTRL2_HMUTE : 0);
166 }
167
172 bool setVolumeDb(int db) {
173 if (db < VOLUME_DB_MIN || db > VOLUME_DB_MAX) return false;
174 uint16_t volume_field = ((uint16_t)db2vol(db) << 8) & HAGCCFG4_VOL_MASK;
175 return updateReg16(REG_HAGCCFG4, HAGCCFG4_VOL_MASK, volume_field);
176 }
177
179 bool setVolume(int volume) override {
180 volume_percent = volume < 0 ? 0 : (volume > 100 ? 100 : volume);
182 return setVolumeDb(db);
183 }
184
185 protected:
188 static uint8_t db2vol(int db) {
189 if (db > 0) return 0;
190 int hi = (-db) / 6;
191 if (hi > 0xF) hi = 0xF;
192 uint8_t lo = (uint8_t)(((-db) - (hi * 6)) * 2);
193 return (uint8_t)((hi << 4) | (lo & 0xF));
194 }
195
196 static bool wordSizeCodes(uint8_t word_size, uint16_t& fs_code,
197 uint16_t& bck_code) {
198 switch (word_size) {
199 case 16:
200 fs_code = (uint16_t)AW88298WordSize::Bits16;
201 bck_code = (uint16_t)AW88298WordSize::Bits16;
202 return true;
203 case 20:
204 fs_code = (uint16_t)AW88298WordSize::Bits20;
205 bck_code = (uint16_t)AW88298WordSize::Bits20;
206 return true;
207 case 24:
208 fs_code = (uint16_t)AW88298WordSize::Bits24;
209 bck_code = (uint16_t)AW88298WordSize::Bits24;
210 return true;
211 case 32:
212 fs_code = (uint16_t)AW88298WordSize::Bits32;
213 bck_code = (uint16_t)AW88298WordSize::Bits32;
214 return true;
215 default:
216 return false;
217 }
218 }
219
220 static bool sampleRateCode(uint32_t sample_rate, uint16_t& code) {
221 switch (sample_rate) {
222 case 8000:
223 code = 0x0;
224 break;
225 case 11025:
226 code = 0x1;
227 break;
228 case 16000:
229 code = 0x3;
230 break;
231 case 22050:
232 code = 0x4;
233 break;
234 case 24000:
235 code = 0x5;
236 break;
237 case 32000:
238 code = 0x6;
239 break;
240 case 44100:
241 code = 0x7;
242 break;
243 case 48000:
244 code = 0x8;
245 break;
246 case 96000:
247 code = 0x9;
248 break;
249 case 192000:
250 code = 0xA;
251 break;
252 default:
253 return false;
254 }
255 return true;
256 }
257};
258
259} // namespace audio_driver
Header only C++ driver for the AW88298 smart amplifier.
Definition AW88298.h:40
static constexpr uint16_t I2SCTRL_I2SMD_MASK
Definition AW88298.h:69
bool begin(uint32_t sample_rate, uint8_t bits)
Initialize the amplifier: software reset, power up (clear PWDN/AMPPD), unmute, and configure the digi...
Definition AW88298.h:93
static constexpr uint16_t HAGCCFG4_VOL_MASK
Definition AW88298.h:72
bool softReset()
Trigger a software reset via REG_ID.
Definition AW88298.h:124
static uint8_t db2vol(int db)
Definition AW88298.h:188
bool setMute(bool mute) override
Mute / unmute the output (HAGCCFG4/SYSCTRL2 HMUTE bit)
Definition AW88298.h:163
static bool sampleRateCode(uint32_t sample_rate, uint16_t &code)
Definition AW88298.h:220
static constexpr uint16_t ID_SOFTRESET
Magic value written to REG_ID to trigger a software reset.
Definition AW88298.h:75
static constexpr uint16_t I2SCTRL_I2SSR_MASK
Definition AW88298.h:66
static constexpr int VOLUME_DB_MAX
Definition AW88298.h:77
bool startOutput()
Enable the power amplifier output stage (clears AMPPD)
Definition AW88298.h:155
Reg
Definition AW88298.h:43
@ REG_HAGCCFG1
Definition AW88298.h:51
@ REG_SYSST
Definition AW88298.h:45
@ REG_SYSINT
Definition AW88298.h:46
@ REG_SYSINTM
Definition AW88298.h:47
@ REG_SYSCTRL
Definition AW88298.h:48
@ REG_SYSCTRL2
Definition AW88298.h:49
@ REG_ID
Definition AW88298.h:44
@ REG_HAGCCFG2
Definition AW88298.h:52
@ REG_I2SCTRL
Definition AW88298.h:50
@ REG_HAGCCFG4
Definition AW88298.h:54
@ REG_HAGCCFG3
Definition AW88298.h:53
static constexpr uint16_t SYSCTRL_I2SEN
Definition AW88298.h:60
AW88298()
AW88298 I2C address is board dependent; 0x36 is a common default.
Definition AW88298.h:81
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 AW88298.h:97
bool begin(AW88298Mode mode=AW88298Mode::I2S, uint8_t word_size=16, uint32_t sample_rate=44100)
Definition AW88298.h:106
static constexpr uint16_t I2SCTRL_I2SFS_MASK
Definition AW88298.h:68
static bool wordSizeCodes(uint8_t word_size, uint16_t &fs_code, uint16_t &bck_code)
Definition AW88298.h:196
bool setFormat(AW88298Mode mode, uint8_t word_size, uint32_t sample_rate)
Configure the digital audio interface: protocol mode, word size and sample rate, and enable the I2S i...
Definition AW88298.h:131
static constexpr uint16_t SYSCTRL2_HMUTE
Definition AW88298.h:63
bool stopOutput()
Disable the power amplifier output stage (sets AMPPD)
Definition AW88298.h:158
bool setVolume(int volume) override
Sets the output volume in % (0...100), mapped to [VOLUME_DB_MIN..VOLUME_DB_MAX] dB.
Definition AW88298.h:179
bool setVolumeDb(int db)
Set the output volume in dB.
Definition AW88298.h:172
static constexpr int VOLUME_DB_MIN
Definition AW88298.h:78
static constexpr uint16_t SYSCTRL_PWDN
Definition AW88298.h:58
static constexpr uint16_t I2SCTRL_I2SBCK_MASK
Definition AW88298.h:67
static constexpr uint16_t SYSCTRL_AMPPD
Definition AW88298.h:59
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 updateReg16(uint8_t reg, uint16_t mask, uint16_t value)
Read-Modify-Write of a 16 bit (big endian) register.
Definition ZephyrDriverCommon.h:136
Namespace for audio driver components.
Definition AudioBoard.h:5
const samplerate_t rate_code[14]
Definition AudioDriver.h:13
void delayMs(unsigned long ms)
Definition API_Delay.h:19
codec_mode_t
Definition DriverCommon.h:290
AW88298WordSize
I2S word size codes (AW88298_REG_I2SCTRL I2SFS / I2SBCK fields)
Definition AW88298.h:22
i2s_format_t
Definition DriverCommon.h:250
AW88298Mode
Digital audio interface mode (AW88298_REG_I2SCTRL I2SMD field)
Definition AW88298.h:15