20 PCMB = 0x3 | (1 << 4),
153 bool begin(uint32_t sample_rate, uint8_t bits) {
162 i2s_format_t fmt,
bool is_master, uint8_t channels)
override {
182 uint32_t sample_rate = 44100, uint8_t word_size = 16,
183 bool playback =
true,
bool capture =
true) {
201 while ((value & 1U) != 0U && retries-- > 0) {
270 switch (sample_rate) {
303 (uint16_t)wm_sample_rate);
305 uint16_t word_size_bits = 0;
335 const uint16_t val = (uint16_t)((1U << 6U) | (volume &
REGMASK_OUT_VOL));
342 const uint16_t val = (uint16_t)((mute ? 1U : 0U) << 8U);
393 const uint8_t val = (uint8_t)((mute ? 1U : 0U) << 7U);
405 if (input < 1 || input > 3)
return false;
407 uint8_t val = (uint8_t)(((input - 1) & 0x03) << 4U) |
408 (uint8_t)(((input - 1) & 0x03) << 2U);
424 (uint16_t)(1U << 7U));
426 (uint16_t)(1U << 7U));
Header only C++ driver for the WM8904 audio codec.
Definition WM8904.h:63
bool setDevices(input_device_t input_device, output_device_t output_device) override
Stores the output device selection for use by configureOutput()
Definition WM8904.h:358
bool begin(uint32_t sample_rate, uint8_t bits)
Initialize the codec: soft reset, power up the analog/digital blocks, configure the digital audio int...
Definition WM8904.h:153
bool setAudioFormat(uint32_t sample_rate, uint8_t word_size=16)
Configure the sample rate and word size of the digital audio interface. The SYSCLK / fs ratio is dete...
Definition WM8904.h:266
WM8904()
Definition WM8904.h:139
bool softReset()
Soft reset of the codec (writes 0x00 to REG_RESET)
Definition WM8904.h:249
bool setInputVolume(uint8_t volume, WM8904Channel channel=WM8904Channel::All)
Set the input volume (0..31) for the given channel(s)
Definition WM8904.h:373
static constexpr uint8_t REGMASK_IN_MUTE
Definition WM8904.h:130
bool isInputVolumeSupported() override
Returns true: the input volume is supported.
Definition WM8904.h:389
static constexpr uint16_t OUTPUT_VOLUME_DEFAULT
Definition WM8904.h:118
bool configureInput()
Configure the default input path: route input 2, default volume, unmuted.
Definition WM8904.h:448
bool setMute(bool mute) override
Mutes/unmutes all outputs.
Definition WM8904.h:355
static constexpr uint8_t REGMASK_INSEL_MODE
Definition WM8904.h:137
bool begin(WM8904Protocol protocol=WM8904Protocol::I2S, uint32_t sample_rate=44100, uint8_t word_size=16, bool playback=true, bool capture=true)
Definition WM8904.h:181
bool routeInput(uint32_t input, WM8904Channel channel=WM8904Channel::All)
Route an analog input (1..3) to the given channel's PGA. Only FrontLeft, FrontRight and All are valid...
Definition WM8904.h:404
output_device_t output_device
Output device selection set via setDevices(), used by configureOutput()
Definition WM8904.h:459
bool setInputMute(bool mute, WM8904Channel channel=WM8904Channel::All)
Mute / unmute the input for the given channel(s)
Definition WM8904.h:392
bool configureOutput()
Definition WM8904.h:433
static constexpr uint8_t REGMASK_INSEL_CMENA
Definition WM8904.h:134
static constexpr uint8_t REGMASK_INSEL_IP_SEL_N
Definition WM8904.h:135
Reg
Definition WM8904.h:66
@ REG_ANALOG_RIGHT_IN_0
Definition WM8904.h:87
@ REG_CLK_RATES_1
Definition WM8904.h:74
@ REG_DAC_DIG_1
Definition WM8904.h:82
@ REG_ANALOG_RIGHT_IN_1
Definition WM8904.h:89
@ REG_GPIO_CONTROL_3
Definition WM8904.h:109
@ REG_AUDIO_IF_3
Definition WM8904.h:79
@ REG_DAC_DIGITAL_VOLUME_RIGHT
Definition WM8904.h:81
@ REG_DC_SERVO_0
Definition WM8904.h:95
@ REG_ANALOG_OUT1_LEFT
Definition WM8904.h:90
@ REG_CLK_RATES_0
Definition WM8904.h:73
@ REG_POWER_MGMT_2
Definition WM8904.h:70
@ REG_CLK_RATES_2
Definition WM8904.h:75
@ REG_GPIO_CONTROL_1
Definition WM8904.h:107
@ REG_AUDIO_IF_0
Definition WM8904.h:76
@ REG_WRT_SEQUENCER_0
Definition WM8904.h:99
@ REG_ANALOG_OUT12_ZC
Definition WM8904.h:94
@ REG_CLS_W_0
Definition WM8904.h:98
@ REG_ANALOG_OUT1_RIGHT
Definition WM8904.h:91
@ REG_DAC_DIGITAL_VOLUME_LEFT
Definition WM8904.h:80
@ REG_FLL_CONTROL_4
Definition WM8904.h:105
@ REG_CHRG_PUMP_0
Definition WM8904.h:97
@ REG_DAC_DIG_0
Definition WM8904.h:85
@ REG_AUDIO_IF_1
Definition WM8904.h:77
@ REG_FLL_NCO_TEST_0
Definition WM8904.h:111
@ REG_ANALOG_OUT2_RIGHT
Definition WM8904.h:93
@ REG_ADC_DIGITAL_VOLUME_RIGHT
Definition WM8904.h:84
@ REG_FLL_CONTROL_2
Definition WM8904.h:103
@ REG_POWER_MGMT_0
Definition WM8904.h:69
@ REG_FLL_NCO_TEST_1
Definition WM8904.h:112
@ REG_ANALOG_OUT2_LEFT
Definition WM8904.h:92
@ REG_RESET
Definition WM8904.h:67
@ REG_FLL_CONTROL_1
Definition WM8904.h:102
@ REG_ANALOG_LEFT_IN_1
Definition WM8904.h:88
@ REG_POWER_MGMT_3
Definition WM8904.h:71
@ REG_AUDIO_IF_2
Definition WM8904.h:78
@ REG_ANALOG_HP_0
Definition WM8904.h:96
@ REG_WRT_SEQUENCER_3
Definition WM8904.h:100
@ REG_FLL_CONTROL_3
Definition WM8904.h:104
@ REG_WRT_SEQUENCER_4
Definition WM8904.h:101
@ REG_ADC_DIGITAL_VOLUME_LEFT
Definition WM8904.h:83
@ REG_ANALOG_LEFT_IN_0
Definition WM8904.h:86
@ REG_GPIO_CONTROL_4
Definition WM8904.h:110
@ REG_GPIO_CONTROL_2
Definition WM8904.h:108
@ REG_ANALOG_ADC_0
Definition WM8904.h:68
@ REG_POWER_MGMT_6
Definition WM8904.h:72
@ REG_FLL_CONTROL_5
Definition WM8904.h:106
static constexpr uint16_t OUTPUT_VOLUME_MAX
Definition WM8904.h:117
static constexpr uint16_t REGMASK_OUT_VU
Definition WM8904.h:125
static constexpr uint16_t REGMASK_OUT_ZC
Definition WM8904.h:126
static constexpr uint16_t INPUT_VOLUME_MAX
Definition WM8904.h:120
static constexpr uint16_t REGMASK_OUT_VOL
Definition WM8904.h:127
static constexpr uint8_t REGMASK_IN_VOLUME
Definition WM8904.h:131
bool setOutputMute(bool mute, WM8904Channel channel=WM8904Channel::All)
Mute / unmute the output for the given channel(s)
Definition WM8904.h:341
bool updateOutput(WM8904Channel channel, uint16_t val, uint16_t mask)
Definition WM8904.h:461
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 WM8904.h:161
bool applyProperties()
Apply the pending volume changes (set VU bit for both output channel pairs)
Definition WM8904.h:421
bool setOutputVolume(uint8_t volume, WM8904Channel channel=WM8904Channel::All)
Set the output volume (0..63) for the given channel(s)
Definition WM8904.h:333
bool setActive(codec_mode_t mode) override
Definition WM8904.h:366
static constexpr uint16_t INPUT_VOLUME_MIN
Definition WM8904.h:119
static constexpr uint16_t REGMASK_OUT_MUTE
Definition WM8904.h:124
bool updateInput(WM8904Channel channel, uint8_t val, uint8_t mask)
Definition WM8904.h:483
bool setInputVolume(int volume) override
Sets the input volume in % (0...100) for all channels.
Definition WM8904.h:381
static constexpr uint16_t INPUT_VOLUME_DEFAULT
Definition WM8904.h:121
bool setVolume(int volume) override
Sets the output volume in % (0...100) for all channels.
Definition WM8904.h:348
static constexpr uint16_t OUTPUT_VOLUME_MIN
Definition WM8904.h:116
bool setProtocol(WM8904Protocol protocol)
Configure the digital audio interface protocol (I2S, LJ, RJ, PCMA/B)
Definition WM8904.h:252
static constexpr uint8_t REGMASK_INSEL_IP_SEL_P
Definition WM8904.h:136
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
bool readReg16(uint8_t reg, uint16_t &value)
Reads a 16 bit (big endian) value from an 8 bit register address.
Definition ZephyrDriverCommon.h:126
bool updateReg(uint8_t reg, uint8_t mask, uint8_t value)
Read-Modify-Write of a single byte register.
Definition ZephyrDriverCommon.h:110
bool writeReg16(uint8_t reg, uint16_t value)
Writes a 16 bit (big endian) value to an 8 bit register address.
Definition ZephyrDriverCommon.h:119
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
int input_volume_percent
Last input volume (in %) provided to setInputVolume()
Definition ZephyrDriverCommon.h:91
Namespace for audio driver components.
Definition AudioBoard.h:5
WM8904FsRatio
SYSCLK / fs ratio.
Definition WM8904.h:24
WM8904Channel
Logical audio channels.
Definition WM8904.h:48
WM8904SampleRate
Sample rate (WM8904_REG_CLK_RATES_1 SAMPLE_RATE field)
Definition WM8904.h:38
@ Rate12kHz
also 11.025kHz
input_device_t
Definition DriverCommon.h:170
codec_mode_t
Definition DriverCommon.h:290
@ CODEC_MODE_ENCODE
Definition DriverCommon.h:293
@ CODEC_MODE_DECODE
Definition DriverCommon.h:294
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
WM8904Protocol
Audio data transfer protocol.
Definition WM8904.h:15
i2s_format_t
Definition DriverCommon.h:250
@ I2S_RIGHT
Definition DriverCommon.h:253
@ I2S_LEFT
Definition DriverCommon.h:252