190 bool begin(uint32_t sample_rate, uint8_t bits) {
199 i2s_format_t fmt,
bool is_master, uint8_t channels)
override {
222 uint32_t sample_rate = 44100, uint8_t word_size = 16,
223 uint32_t mclk_to_fs_ratio = 256,
bool playback =
true,
224 bool capture =
true) {
287 uint32_t mclk_to_fs_ratio = 256) {
310 uint16_t addctl3_val;
311 switch (sample_rate) {
351 switch (mclk_to_fs_ratio) {
396 const uint16_t val = (uint16_t)((1U << 8U) | (volume &
REGMASK_OUT_VOL));
418 uint16_t val = mute ? 3 : 0;
573 uint32_t delay_remaining_ms;
576 delay_remaining_ms = 93;
579 delay_remaining_ms = 75;
582 delay_remaining_ms = 32;
587 delay_remaining_ms = 2;
596 while (delay_remaining_ms > 0) {
598 if ((status & 1U) == 0U)
break;
600 delay_remaining_ms--;
602 return rc && (status & 1U) == 0U;
612 assert(
wire !=
nullptr);
614 (uint8_t)(reg >> 8), (uint8_t)(reg & 0xFF),
615 (uint8_t)(value >> 8), (uint8_t)(value & 0xFF),
617 return i2c_bus_write_bytes(
wire,
i2c_addr, data, 2, data + 2, 2) == 0;
623 assert(
wire !=
nullptr);
624 uint8_t reg_bytes[2] = {(uint8_t)(reg >> 8), (uint8_t)(reg & 0xFF)};
625 uint8_t data[2] = {0, 0};
626 if (i2c_bus_read_bytes(
wire,
i2c_addr, reg_bytes, 2, data, 2) != 0)
628 value = ((uint16_t)data[0] << 8) | data[1];
636 uint16_t updated = (old & ~mask) | (value & mask);
637 if (updated == old)
return true;
Header only C++ driver for the WM8962 audio codec.
Definition WM8962.h:60
bool updateOutput(WM8962Channel channel, uint16_t val, uint16_t mask)
Definition WM8962.h:641
Reg
Definition WM8962.h:63
@ REG_ADDCTL4
Definition WM8962.h:102
@ REG_INT_STATUS_2
Definition WM8962.h:128
@ REG_IFACE1
Definition WM8962.h:73
@ REG_FLL_CTRL_6
Definition WM8962.h:125
@ REG_DACCTL2
Definition WM8962.h:70
@ REG_FLL_CTRL_1
Definition WM8962.h:122
@ REG_LDAC
Definition WM8962.h:74
@ REG_IFACE2
Definition WM8962.h:76
@ REG_DC_SERVO_0
Definition WM8962.h:106
@ REG_CHARGE_PUMP_1
Definition WM8962.h:109
@ REG_LEFT_SPEAKER_MIXER_VOLUME
Definition WM8962.h:119
@ REG_LOUT2
Definition WM8962.h:99
@ REG_RDAC
Definition WM8962.h:75
@ REG_ALC1
Definition WM8962.h:79
@ REG_FLL_CTRL_3
Definition WM8962.h:124
@ REG_POWER1
Definition WM8962.h:87
@ REG_TEMP
Definition WM8962.h:101
@ REG_LEFT_HEADPHONE_MIXER_VOLUME
Definition WM8962.h:115
@ REG_ALC3
Definition WM8962.h:81
@ REG_LEFT_INPUT_PGA
Definition WM8962.h:96
@ REG_ADDCTL1
Definition WM8962.h:85
@ REG_LINVOL
Definition WM8962.h:64
@ REG_FLL_CTRL_8
Definition WM8962.h:127
@ REG_RADC
Definition WM8962.h:84
@ REG_LADC
Definition WM8962.h:83
@ REG_ADDCTL3
Definition WM8962.h:89
@ REG_CLASSD1
Definition WM8962.h:103
@ REG_POWER2
Definition WM8962.h:88
@ REG_MONOMIX2
Definition WM8962.h:98
@ REG_IFACE0
Definition WM8962.h:71
@ REG_RIGHT_SPEAKER_MIXER_VOLUME
Definition WM8962.h:120
@ REG_LEFT_SPEAKER_MIXER
Definition WM8962.h:117
@ REG_CLASSD3
Definition WM8962.h:104
@ REG_LOUT1
Definition WM8962.h:66
@ REG_ROUT2
Definition WM8962.h:100
@ REG_FLL_CTRL_7
Definition WM8962.h:126
@ REG_PLL2
Definition WM8962.h:121
@ REG_APOP2
Definition WM8962.h:91
@ REG_INPUTMIX
Definition WM8962.h:95
@ REG_RIGHT_INPUT_PGA
Definition WM8962.h:97
@ REG_NOISEG
Definition WM8962.h:82
@ REG_RIGHT_SPEAKER_MIXER
Definition WM8962.h:118
@ REG_RIGHT_HEADPHONE_MIXER
Definition WM8962.h:114
@ REG_RIGHT_HEADPHONE_MIXER_VOLUME
Definition WM8962.h:116
@ REG_CLOCK1
Definition WM8962.h:68
@ REG_DC_SERVO_1
Definition WM8962.h:107
@ REG_RESET
Definition WM8962.h:77
@ REG_ADDCTL2
Definition WM8962.h:86
@ REG_ALC2
Definition WM8962.h:80
@ REG_WRITE_SEQ_CTRL_3
Definition WM8962.h:112
@ REG_WRITE_SEQ_CTRL_2
Definition WM8962.h:111
@ REG_LEFT_HEADPHONE_MIXER
Definition WM8962.h:113
@ REG_ANALOG_HP_0
Definition WM8962.h:108
@ REG_WRITE_SEQ_CTRL_1
Definition WM8962.h:110
@ REG_CLOCK2
Definition WM8962.h:72
@ REG_CLK4
Definition WM8962.h:105
@ REG_DACCTL1
Definition WM8962.h:69
@ REG_3D
Definition WM8962.h:78
@ REG_APOP1
Definition WM8962.h:90
@ REG_LINPATH
Definition WM8962.h:93
@ REG_RINPATH
Definition WM8962.h:94
@ REG_RINVOL
Definition WM8962.h:65
@ REG_INPUT_MIXER_1
Definition WM8962.h:92
@ REG_FLL_CTRL_2
Definition WM8962.h:123
@ REG_ROUT1
Definition WM8962.h:67
static constexpr uint16_t LINEIN_MAX_VOLUME_VALUE
Definition WM8962.h:163
bool setDevices(input_device_t input_device, output_device_t output_device) override
Stores the output device selection for use by configureOutput()
Definition WM8962.h:440
bool begin(uint32_t sample_rate, uint8_t bits)
Initialize the codec: soft reset, power up the analog/digital blocks, run the built-in write sequence...
Definition WM8962.h:190
static constexpr uint16_t IFACE0_WL_MASK
Definition WM8962.h:140
static constexpr uint16_t HEADPHONE_MIN_VOLUME_VALUE
Definition WM8962.h:162
static constexpr uint16_t SPEAKER_MAX_VOLUME_VALUE
Definition WM8962.h:164
bool routeOutput(uint16_t mixer_value, WM8962Channel channel)
Select the output mixer source register for the given channel (the raw mixer-enable value is written ...
Definition WM8962.h:504
bool setAudioFormat(uint32_t sample_rate, uint8_t word_size=16, uint32_t mclk_to_fs_ratio=256)
Configure word size, sysclk/sample-rate divider (REG_ADDCTL3) and bit-clock divider (REG_CLK4 = syscl...
Definition WM8962.h:286
bool softReset()
Soft reset of the codec (writes 0x6243 to REG_RESET)
Definition WM8962.h:270
bool isInputVolumeSupported() override
Returns true: the input volume is supported.
Definition WM8962.h:471
static constexpr uint16_t L_CH_MUTE_MASK
Definition WM8962.h:134
bool configureInput()
Configure the default input path: route input1/input3, default volume, unmuted.
Definition WM8962.h:552
bool setMute(bool mute) override
Mutes/unmutes all outputs.
Definition WM8962.h:437
static constexpr uint16_t WSEQ_ENA
Definition WM8962.h:131
WM8962()
Definition WM8962.h:173
bool setInputMute(bool mute, WM8962Channel channel=WM8962Channel::All)
Mute / unmute the input for the given channel(s)
Definition WM8962.h:474
bool updateInput(WM8962Channel channel, uint16_t val, uint16_t mask)
Definition WM8962.h:663
static constexpr uint16_t SPEAKER_MIN_VOLUME_VALUE
Definition WM8962.h:165
output_device_t output_device
Output device selection set via setDevices(), used by configureOutput()
Definition WM8962.h:607
static constexpr uint16_t DAC_MAX_VOLUME_VALUE
Definition WM8962.h:160
bool configureOutput()
Definition WM8962.h:536
static constexpr uint16_t REGMASK_IN_ZC
Definition WM8962.h:155
static constexpr uint16_t REGMASK_IN_VOLUME
Definition WM8962.h:156
static constexpr uint16_t REGMASK_OUT_VU
Definition WM8962.h:148
static constexpr uint16_t REGMASK_OUT_ZC
Definition WM8962.h:149
static constexpr uint16_t DAC_DEFAULT_VOLUME_VALUE
Definition WM8962.h:168
bool setOutputMute(bool mute, WM8962Channel channel=WM8962Channel::All)
Mute / unmute the output for the given channel(s)
Definition WM8962.h:402
static constexpr uint16_t IFACE0_WL_16BITS
Definition WM8962.h:142
static constexpr uint16_t WSEQ_DONE_EINT_MASK
Definition WM8962.h:132
static constexpr uint16_t REGMASK_OUT_VOL
Definition WM8962.h:150
static constexpr uint16_t IFACE0_WL_24BITS
Definition WM8962.h:144
static constexpr uint16_t ADC_DEFAULT_VOLUME_VALUE
Definition WM8962.h:167
static constexpr uint16_t CLOCK2_BCLK_DIV_MASK
Definition WM8962.h:137
bool updateRegWide(uint16_t reg, uint16_t mask, uint16_t value)
Read-Modify-Write of a 16 bit register addressed via a 16 bit address.
Definition WM8962.h:633
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 WM8962.h:198
bool setOutputVolume(uint8_t volume, WM8962Channel channel=WM8962Channel::All)
Set the output volume (0..127) for the given channel(s)
Definition WM8962.h:394
bool applyProperties()
Apply pending volume changes (set VU bit for output and input)
Definition WM8962.h:526
bool begin(WM8962Protocol protocol=WM8962Protocol::I2S, uint32_t sample_rate=44100, uint8_t word_size=16, uint32_t mclk_to_fs_ratio=256, bool playback=true, bool capture=true)
Definition WM8962.h:221
static constexpr uint16_t IFACE0_WL_32BITS
Definition WM8962.h:145
static constexpr uint16_t R_CH_MUTE_MASK
Definition WM8962.h:135
bool readRegWide(uint16_t reg, uint16_t &value)
Definition WM8962.h:622
bool setActive(codec_mode_t mode) override
Definition WM8962.h:448
static constexpr uint16_t IFACE0_FORMAT_MASK
Definition WM8962.h:139
static constexpr uint16_t HEADPHONE_MAX_VOLUME_VALUE
Definition WM8962.h:161
static constexpr uint16_t IFACE0_WL_20BITS
Definition WM8962.h:143
bool setInputVolume(int volume) override
Sets the input volume in % (0...100) for all channels.
Definition WM8962.h:463
bool setInputVolume(uint8_t volume, WM8962Channel channel=WM8962Channel::All)
Set the input volume for the given channel(s) (6 bit value)
Definition WM8962.h:455
bool setVolume(int volume) override
Sets the output volume in % (0...100) for all channels.
Definition WM8962.h:430
static constexpr uint16_t REGMASK_IN_MUTE
Definition WM8962.h:154
bool routeInput(WM8962InputPgaSource source, WM8962Channel channel)
Select the input PGA source for the given channel (FrontLeft / FrontRight only).
Definition WM8962.h:485
bool writeRegWide(uint16_t reg, uint16_t value)
Definition WM8962.h:611
static constexpr uint16_t SPEAKER_DEFAULT_VOLUME_VALUE
Definition WM8962.h:171
static constexpr uint16_t LINEIN_DEFAULT_VOLUME_VALUE
Definition WM8962.h:170
bool setProtocol(WM8962Protocol protocol)
Configure the digital audio interface protocol (I2S, LJ, RJ, PCMA/B)
Definition WM8962.h:273
static constexpr uint16_t HEADPHONE_DEFAULT_VOLUME_VALUE
Definition WM8962.h:169
static constexpr uint16_t IFACE0_WL_SHIFT
Definition WM8962.h:141
static constexpr uint16_t ADC_MAX_VOLUME_VALUE
Definition WM8962.h:159
static constexpr uint16_t REGMASK_IN_VU
Definition WM8962.h:153
bool runSequence(WM8962Sequence id)
Trigger one of the codec's built-in write sequences and wait (up to the documented timeout) until it ...
Definition WM8962.h:572
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
i2c_bus_handle_t wire
Definition ZephyrDriverCommon.h:86
int input_volume_percent
Last input volume (in %) provided to setInputVolume()
Definition ZephyrDriverCommon.h:91
Namespace for audio driver components.
Definition AudioBoard.h:5
WM8962Protocol
Digital audio interface protocol.
Definition WM8962.h:15
input_device_t
Definition DriverCommon.h:170
void delayMs(unsigned long ms)
Definition API_Delay.h:19
codec_mode_t
Definition DriverCommon.h:290
@ CODEC_MODE_ENCODE
Definition DriverCommon.h:293
@ CODEC_MODE_DECODE
Definition DriverCommon.h:294
WM8962Channel
Logical audio channels.
Definition WM8962.h:32
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
WM8962Sequence
Write sequencer sequence ids.
Definition WM8962.h:41
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
WM8962InputPgaSource
Input PGA source (used for routeInput)
Definition WM8962.h:24