blob: edc0fce9b82a9c85030ef91d970d1e4aef79a3cc [file] [log] [blame] [edit]
/*
* Copyright 2025 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_DRIVERS_AUDIO_WM8962_H_
#define ZEPHYR_DRIVERS_AUDIO_WM8962_H_
#ifdef __cplusplus
extern "C" {
#endif
#define WM8962_SWAP_UINT16_BYTE_SEQUENCE(x) ((((x) & 0x00ffU) << 8U) | (((x) & 0xff00U) >> 8U))
/*! @brief WM8962 max clock */
#define WM8962_MAX_DSP_CLOCK (24576000U)
#define WM8962_MAX_SYS_CLOCK (12288000U)
/*! @brief WM8962 f2 better performance range */
#define WM8962_FLL_VCO_MIN_FREQ 90000000U
#define WM8962_FLL_VCO_MAX_FREQ 100000000U
#define WM8962_FLL_LOCK_TIMEOUT 10000000U
/*! @brief WM8962 FLLN range */
#define WM8962_FLL_N_MIN_VALUE 6U
#define WM8962_FLL_N_MAX_VALUE 12U
#define WM8962_FLL_MAX_REFERENCE_CLOCK (13500000U)
/*! @brief Define the register address of WM8962. */
#define WM8962_REG_LINVOL 0x0U
#define WM8962_REG_RINVOL 0x1U
#define WM8962_REG_LOUT1 0x2U
#define WM8962_REG_ROUT1 0x3U
#define WM8962_REG_CLOCK1 0x4U
#define WM8962_REG_DACCTL1 0x5U
#define WM8962_REG_DACCTL2 0x6U
#define WM8962_REG_IFACE0 0x7U
#define WM8962_REG_IFACE1 0x9U
#define WM8962_REG_CLOCK2 0x8U
#define WM8962_REG_IFACE2 0xEU
#define WM8962_REG_LDAC 0xaU
#define WM8962_REG_RDAC 0xbU
#define WM8962_REG_RESET 0xfU
#define WM8962_REG_3D 0x10U
#define WM8962_REG_ALC1 0x11U
#define WM8962_REG_ALC2 0x12U
#define WM8962_REG_ALC3 0x13U
#define WM8962_REG_NOISEG 0x14U
#define WM8962_REG_LADC 0x15U
#define WM8962_REG_RADC 0x16U
#define WM8962_REG_ADDCTL1 0x17U
#define WM8962_REG_ADDCTL2 0x18U
#define WM8962_REG_POWER1 0x19U
#define WM8962_REG_POWER2 0x1aU
#define WM8962_REG_ADDCTL3 0x1bU
#define WM8962_REG_APOP1 0x1cU
#define WM8962_REG_APOP2 0x1dU
#define WM8962_REG_INPUT_MIXER_1 0x1FU
#define WM8962_REG_LINPATH 0x20U
#define WM8962_REG_RINPATH 0x21U
#define WM8962_REG_INPUTMIX 0x22U
#define WM8962_REG_LEFT_INPUT_PGA 0x25U
#define WM8962_REG_RIGHT_INPUT_PGA 0x26U
#define WM8962_REG_MONOMIX2 0x27U
#define WM8962_REG_LOUT2 0x28U
#define WM8962_REG_ROUT2 0x29U
#define WM8962_REG_TEMP 0x2FU
#define WM8962_REG_ADDCTL4 0x30U
#define WM8962_REG_CLASSD1 0x31U
#define WM8962_REG_CLASSD3 0x33U
#define WM8962_REG_CLK4 0x38U
#define WM8962_REG_DC_SERVO_0 0x3CU
#define WM8962_REG_DC_SERVO_1 0x3DU
#define WM8962_REG_ANALOG_HP_0 0x45U
#define WM8962_REG_CHARGE_PUMP_1 0x48U
#define WM8962_REG_WRITE_SEQ_CTRL_1 0x57U
#define WM8962_REG_WRITE_SEQ_CTRL_2 0x5AU
#define WM8962_REG_WRITE_SEQ_CTRL_3 0x5DU
#define WM8962_WSEQ_ENA 0x20U
#define WM8962_REG_LEFT_HEADPHONE_MIXER 0x64U
#define WM8962_REG_RIGHT_HEADPHONE_MIXER 0x65U
#define WM8962_REG_LEFT_HEADPHONE_MIXER_VOLUME 0x66U
#define WM8962_REG_RIGHT_HEADPHONE_MIXER_VOLUME 0x67U
#define WM8962_REG_LEFT_SPEAKER_MIXER 0x69U
#define WM8962_REG_RIGHT_SPEAKER_MIXER 0x6AU
#define WM8962_REG_LEFT_SPEAKER_MIXER_VOLUME 0x6BU
#define WM8962_REG_RIGHT_SPEAKER_MIXER_VOLUME 0x6CU
#define WM8962_REG_PLL2 0x81U
#define WM8962_REG_FLL_CTRL_1 0x9BU
#define WM8962_REG_FLL_CTRL_2 0x9CU
#define WM8962_REG_FLL_CTRL_3 0x9DU
#define WM8962_REG_FLL_CTRL_6 0xA0U
#define WM8962_REG_FLL_CTRL_7 0xA1U
#define WM8962_REG_FLL_CTRL_8 0xA2U
#define WM8962_REG_INT_STATUS_2 0x231U
#define WSEQ_DONE_EINT_MASK 0x80U
#define WM8962_L_CH_MUTE_MASK 2U
#define WM8962_R_CH_MUTE_MASK 1U
/*! @brief WM8962 CLOCK2 bits */
#define WM8962_CLOCK2_BCLK_DIV_MASK 0xFU
/*! @brief WM8962_IFACE0 FORMAT bits */
#define WM8962_IFACE0_FORMAT_MASK 0x13U
#define WM8962_IFACE0_FORMAT_SHIFT 0x00U
#define WM8962_IFACE0_FORMAT_RJ 0x00U
#define WM8962_IFACE0_FORMAT_LJ 0x01U
#define WM8962_IFACE0_FORMAT_I2S 0x02U
#define WM8962_IFACE0_FORMAT_DSP 0x03U
#define WM8962_IFACE0_FORMAT(x) (((x) << WM8962_IFACE1_FORMAT_SHIFT) & WM8962_IFACE1_FORMAT_MASK)
/*! @brief WM8962_IFACE0 WL bits */
#define WM8962_IFACE0_WL_MASK 0x0CU
#define WM8962_IFACE0_WL_SHIFT 0x02U
#define WM8962_IFACE0_WL_16BITS 0x00U
#define WM8962_IFACE0_WL_20BITS 0x01U
#define WM8962_IFACE0_WL_24BITS 0x02U
#define WM8962_IFACE0_WL_32BITS 0x03U
#define WM8962_IFACE0_WL(x) (((x) << WM8962_IFACE0_WL_SHIFT) & WM8962_IFACE0_WL_MASK)
/*! @brief WM8962_IFACE1 LRP bit */
#define WM8962_IFACE1_LRP_MASK 0x10U
#define WM8962_IFACE1_LRP_SHIFT 0x04U
#define WM8962_IFACE1_LRCLK_NORMAL_POL 0x00U
#define WM8962_IFACE1_LRCLK_INVERT_POL 0x01U
#define WM8962_IFACE1_DSP_MODEA 0x00U
#define WM8962_IFACE1_DSP_MODEB 0x01U
#define WM8962_IFACE1_LRP(x) (((x) << WM8962_IFACE1_LRP_SHIFT) & WM8962_IFACE1_LRP_MASK)
/*! @brief WM8962_IFACE1 DLRSWAP bit */
#define WM8962_IFACE1_DLRSWAP_MASK 0x20U
#define WM8962_IFACE1_DLRSWAP_SHIFT 0x05U
#define WM8962_IFACE1_DACCH_NORMAL 0x00U
#define WM8962_IFACE1_DACCH_SWAP 0x01U
#define WM8962_IFACE1_DLRSWAP(x) (((x) << WM8962_IFACE1_DLRSWAP_SHIFT) & WM8962_IFACE1_DLRSWAP_MASK)
/*! @brief WM8962_IFACE1 MS bit */
#define WM8962_IFACE1_MS_MASK 0x40U
#define WM8962_IFACE1_MS_SHIFT 0x06U
#define WM8962_IFACE1_SLAVE 0x00U
#define WM8962_IFACE1_MASTER 0x01U
#define WM8962_IFACE1_MS(x) (((x) << WM8962_IFACE1_MS_SHIFT) & WM8962_IFACE1_MS_MASK)
/*! @brief WM8962_IFACE1 BCLKINV bit */
#define WM8962_IFACE1_BCLKINV_MASK 0x80U
#define WM8962_IFACE1_BCLKINV_SHIFT 0x07U
#define WM8962_IFACE1_BCLK_NONINVERT 0x00U
#define WM8962_IFACE1_BCLK_INVERT 0x01U
#define WM8962_IFACE1_BCLKINV(x) (((x) << WM8962_IFACE1_BCLKINV_SHIFT) & WM8962_IFACE1_BCLKINV_MASK)
/*! @brief WM8962_IFACE1 ALRSWAP bit */
#define WM8962_IFACE1_ALRSWAP_MASK 0x100U
#define WM8962_IFACE1_ALRSWAP_SHIFT 0x08U
#define WM8962_IFACE1_ADCCH_NORMAL 0x00U
#define WM8962_IFACE1_ADCCH_SWAP 0x01U
#define WM8962_IFACE1_ALRSWAP(x) (((x) << WM8962_IFACE1_ALRSWAP_SHIFT) & WM8962_IFACE1_ALRSWAP_MASK)
/*! @brief WM8962_POWER1 */
#define WM8962_POWER1_VREF_MASK 0x40U
#define WM8962_POWER1_VREF_SHIFT 0x06U
#define WM8962_POWER1_AINL_MASK 0x20U
#define WM8962_POWER1_AINL_SHIFT 0x05U
#define WM8962_POWER1_AINR_MASK 0x10U
#define WM8962_POWER1_AINR_SHIFT 0x04U
#define WM8962_POWER1_ADCL_MASK 0x08U
#define WM8962_POWER1_ADCL_SHIFT 0x03U
#define WM8962_POWER1_ADCR_MASK 0x4U
#define WM8962_POWER1_ADCR_SHIFT 0x02U
#define WM8962_POWER1_MICB_MASK 0x02U
#define WM8962_POWER1_MICB_SHIFT 0x01U
#define WM8962_POWER1_DIGENB_MASK 0x01U
#define WM8962_POWER1_DIGENB_SHIFT 0x00U
/*! @brief WM8962_POWER2 */
#define WM8962_POWER2_DACL_MASK 0x100U
#define WM8962_POWER2_DACL_SHIFT 0x08U
#define WM8962_POWER2_DACR_MASK 0x80U
#define WM8962_POWER2_DACR_SHIFT 0x07U
#define WM8962_POWER2_LOUT1_MASK 0x40U
#define WM8962_POWER2_LOUT1_SHIFT 0x06U
#define WM8962_POWER2_ROUT1_MASK 0x20U
#define WM8962_POWER2_ROUT1_SHIFT 0x05U
#define WM8962_POWER2_SPKL_MASK 0x10U
#define WM8962_POWER2_SPKL_SHIFT 0x04U
#define WM8962_POWER2_SPKR_MASK 0x08U
#define WM8962_POWER2_SPKR_SHIFT 0x03U
#define WM8962_POWER3_LMIC_MASK 0x20U
#define WM8962_POWER3_LMIC_SHIFT 0x05U
#define WM8962_POWER3_RMIC_MASK 0x10U
#define WM8962_POWER3_RMIC_SHIFT 0x04U
#define WM8962_POWER3_LOMIX_MASK 0x08U
#define WM8962_POWER3_LOMIX_SHIFT 0x03U
#define WM8962_POWER3_ROMIX_MASK 0x04U
#define WM8962_POWER3_ROMIX_SHIFT 0x02U
/*! @brief WM8962 I2C address. */
#define WM8962_I2C_ADDR (0x34 >> 1U)
/*! @brief WM8962 I2C baudrate */
#define WM8962_I2C_BAUDRATE (100000U)
/*! @brief WM8962 maximum volume value */
#define WM8962_ADC_MAX_VOLUME_VALUE 0xFFU
#define WM8962_DAC_MAX_VOLUME_VALUE 0xFFU
#define WM8962_HEADPHONE_MAX_VOLUME_VALUE 0x7FU
#define WM8962_HEADPHONE_MIN_VOLUME_VALUE 0x2FU
#define WM8962_LINEIN_MAX_VOLUME_VALUE 0x3FU
#define WM8962_SPEAKER_MAX_VOLUME_VALUE 0x7FU
#define WM8962_SPEAKER_MIN_VOLUME_VALUE 0x2FU
#define WM8962_ADC_DEFAULT_VOLUME_VALUE 0x1C0U
#define WM8962_DAC_DEFAULT_VOLUME_VALUE 0x1C0U
#define WM8962_HEADPHONE_DEFAULT_VOLUME_VALUE 0x179U
#define WM8962_LINEIN_DEFAULT_VOLUME_VALUE 0x12DU
#define WM8962_SPEAKER_DEFAULT_VOLUME_VALUE 0x179U
/**
* WM8962_REG_LOUT1, WM8962_REG_ROUT1 (headphone outs),
* WM8962_REG_LOUT2, WM8962_REG_ROUT2 (line outs):
* [8] - VU: Volume update, works for entire channel pair
* [7] - ZC: Zero-crossing enable
* [6:0] - VOL: 7-bit volume value
*/
#define WM8962_REGVAL_OUT_VOL(vu, zc, vol) \
(((vu & 0b1) << 8) | (zc & 0b1) << 7 | (vol & 0b001111111))
#define WM8962_REGMASK_OUT_VU 0b100000000
#define WM8962_REGMASK_OUT_ZC 0b010000000
#define WM8962_REGMASK_OUT_VOL 0b001111111
#define WM8962_OUT_MUTE(x) ((x << 8U) & (1U << 8U))
/**
* WM8962_REG_LINVOL, WM8962_REG_RINVOL:
* [8] - VU: Volume update, works for entire channel pair
* [7] - MUTE: Input mute
* [6] - ZC: Zero-crossing enable
* [5:0] - VOL: 6-bit volume value
*/
#define WM8962_REGVAL_IN_VOL(vu, mute, zc, vol) \
((vu & 0b1) << 8 | (mute & 0b1) << 7 | (zc & 0b1) << 6 | (vol & 0b000111111))
#define WM8962_REGMASK_IN_VU 0b100000000
#define WM8962_REGMASK_IN_MUTE 0b010000000
#define WM8962_REGMASK_IN_ZC 0b001000000
#define WM8962_REGMASK_IN_VOLUME 0b000111111
/*! @brief wm8962 input mixer source.
* @anchor wm8962_input_mixer_source_t
*/
typedef enum _wm8962_input_mixer_source {
kWM8962_InputMixerSourceInput2 = 4U, /*!< input mixer source input 2 */
kWM8962_InputMixerSourceInput3 = 2U, /*!< input mixer source input 3 */
kWM8962_InputMixerSourceInputPGA = 1U, /*!< input mixer source input PGA */
} wm8962_input_mixer_source_t;
/*! @brief wm8962 output mixer source.
* @anchor wm8962_output_mixer_source_t
*/
typedef enum _wm8962_output_mixer_source {
kWM8962_OutputMixerDisabled = 0U, /*!< output mixer disabled */
kWM8962_OutputMixerSourceInput4Right = 1U, /*!< output mixer source input 4 left */
kWM8962_OutputMixerSourceInput4Left = 2U, /*!< output mixer source input 4 right */
kWM8962_OutputMixerSourceRightInputMixer = 4U, /*!< output mixer source left input mixer */
kWM8962_OutputMixerSourceLeftInputMixer = 8U, /*!< output mixer source right input mixer*/
kWM8962_OutputMixerSourceRightDAC = 0x10U, /*!< output mixer source left DAC */
kWM8962_OutputMixerSourceLeftDAC = 0x20U, /*!< output mixer source Right DAC */
} wm8962_output_mixer_source_t;
/*! @brief Modules in WM8962 board. */
typedef enum _wm8962_module {
kWM8962_ModuleADC = 0, /*!< ADC module in WM8962 */
kWM8962_ModuleDAC = 1, /*!< DAC module in WM8962 */
kWM8962_ModuleMICB = 4, /*!< Mic bias */
kWM8962_ModuleMIC = 5, /*!< Input Mic */
kWM8962_ModuleLineIn = 6, /*!< Analog in PGA */
kWM8962_ModuleHeadphone = 7, /*!< Line out module */
kWM8962_ModuleSpeaker = 8, /*!< Speaker module */
kWM8962_ModuleHeaphoneMixer = 9, /*!< Output mixer */
kWM8962_ModuleSpeakerMixer = 10, /*!< Output mixer */
} wm8962_module_t;
/*! @brief wm8962 play channel
* @anchor _wm8962_play_channel
*/
typedef enum _wm8962_play_channel {
kWM8962_HeadphoneLeft = 1, /*!< wm8962 headphone left channel */
kWM8962_HeadphoneRight = 2, /*!< wm8962 headphone right channel */
kWM8962_SpeakerLeft = 4, /*!< wm8962 speaker left channel */
kWM8962_SpeakerRight = 8, /*!< wm8962 speaker right channel */
} wm8962_play_channel_t;
/*!
* @brief The audio data transfer protocol choice.
* WM8962 only supports I2S format and PCM format.
*/
typedef enum _wm8962_protocol {
kWM8962_BusPCMA = 4, /*!< PCMA mode */
kWM8962_BusPCMB = 3, /*!< PCMB mode */
kWM8962_BusI2S = 2, /*!< I2S type */
kWM8962_BusLeftJustified = 1, /*!< Left justified mode */
kWM8962_BusRightJustified = 0, /*!< Right justified mode */
} wm8962_protocol_t;
/*! @brief wm8962 input source */
typedef enum _wm8962_input_pga_source {
kWM8962_InputPGASourceInput1 = 8, /*!< Input PGA source input1 */
kWM8962_InputPGASourceInput2 = 4, /*!< Input PGA source input2 */
kWM8962_InputPGASourceInput3 = 2, /*!< Input PGA source input3 */
kWM8962_InputPGASourceInput4 = 1, /*!< Input PGA source input4 */
} wm8962_input_pga_source_t;
/*! @brief wm8962 input source */
typedef enum _wm8962_output_pga_source {
kWM8962_OutputPGASourceMixer = 0, /*!< Output PGA source mixer */
kWM8962_OutputPGASourceDAC = 1, /*!< Output PGA source DAC */
} wm8962_output_pga_source_t;
/*! @brief audio sample rate definition
* @anchor _wm8962_sample_rate
*/
typedef enum _wm8962_sample_rate {
kWM8962_AudioSampleRate8kHz = 8000U, /*!< Sample rate 8000 Hz */
kWM8962_AudioSampleRate11025Hz = 11025U, /*!< Sample rate 11025 Hz */
kWM8962_AudioSampleRate12kHz = 12000U, /*!< Sample rate 12000 Hz */
kWM8962_AudioSampleRate16kHz = 16000U, /*!< Sample rate 16000 Hz */
kWM8962_AudioSampleRate22050Hz = 22050U, /*!< Sample rate 22050 Hz */
kWM8962_AudioSampleRate24kHz = 24000U, /*!< Sample rate 24000 Hz */
kWM8962_AudioSampleRate32kHz = 32000U, /*!< Sample rate 32000 Hz */
kWM8962_AudioSampleRate44100Hz = 44100U, /*!< Sample rate 44100 Hz */
kWM8962_AudioSampleRate48kHz = 48000U, /*!< Sample rate 48000 Hz */
kWM8962_AudioSampleRate88200Hz = 88200U, /*!< Sample rate 88200 Hz */
kWM8962_AudioSampleRate96kHz = 96000U, /*!< Sample rate 96000 Hz */
} wm8962_sample_rate_t;
/*! @brief audio bit width
* @anchor _wm8962_audio_bit_width
*/
typedef enum _wm8962_audio_bit_width {
kWM8962_AudioBitWidth16bit = 16U, /*!< audio bit width 16 */
kWM8962_AudioBitWidth20bit = 20U, /*!< audio bit width 20 */
kWM8962_AudioBitWidth24bit = 24U, /*!< audio bit width 24 */
kWM8962_AudioBitWidth32bit = 32U, /*!< audio bit width 32 */
} wm8962_audio_bit_width_t;
/*! @brief wm8962 fll clock source */
typedef enum _wm8962_fllclk_source {
kWM8962_FLLClkSourceMCLK = 0U, /*!< FLL clock source from MCLK */
kWM8962_FLLClkSourceBCLK = 1U, /*!< FLL clock source from BCLK */
} wm8962_fllclk_source_t;
/*! @brief wm8962 sysclk source */
typedef enum _wm8962_sysclk_source {
kWM8962_SysClkSourceMclk = 0U, /*!< sysclk source from external MCLK */
kWM8962_SysClkSourceFLL = 1U, /*!< sysclk source from internal FLL */
} wm8962_sysclk_source_t;
/*! @brief WM8962 default sequence */
typedef enum _wm8962_sequence_id {
kWM8962_SequenceDACToHeadphonePowerUp = 0x80U, /*!< dac to headphone power up sequence */
kWM8962_SequenceAnalogueInputPowerUp = 0x92U, /*!< Analogue input power up sequence */
kWM8962_SequenceChipPowerDown = 0x9BU, /*!< Chip power down sequence */
kWM8962_SequenceSpeakerSleep = 0xE4U, /*!< Speaker sleep sequence */
kWM8962_SequenceSpeakerWake = 0xE8U, /*!< speaker wake sequence */
} wm8962_sequence_id_t;
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_DRIVERS_AUDIO_WM8962_H_ */