| /* |
| * Copyright 2017- 2019 NXP |
| * All rights reserved. |
| * |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| #ifndef _FSL_CODEC_COMMON_H_ |
| #define _FSL_CODEC_COMMON_H_ |
| |
| #include "fsl_common.h" |
| #include "fsl_codec_adapter.h" |
| |
| /*! |
| * @addtogroup codec_common |
| * @{ |
| */ |
| /******************************************************************************* |
| * Definitions |
| ******************************************************************************/ |
| /*! @name Driver version */ |
| /*@{*/ |
| /*! @brief CLOCK driver version 2.2.0. */ |
| #define FSL_CODEC_DRIVER_VERSION (MAKE_VERSION(2, 2, 0)) |
| /*@}*/ |
| |
| /*! @brief codec maximum volume range */ |
| #define CODEC_VOLUME_MAX_VALUE (100U) |
| |
| /*! @brief CODEC status */ |
| enum _codec_status |
| { |
| kStatus_CODEC_NotSupport = MAKE_STATUS(kStatusGroup_CODEC, 0U), /*!< CODEC not support status */ |
| kStatus_CODEC_DeviceNotRegistered = MAKE_STATUS(kStatusGroup_CODEC, 1U), /*!< CODEC device register failed status */ |
| kStatus_CODEC_I2CBusInitialFailed = |
| MAKE_STATUS(kStatusGroup_CODEC, 2U), /*!< CODEC i2c bus initialization failed status */ |
| kStatus_CODEC_I2CCommandTransferFailed = |
| MAKE_STATUS(kStatusGroup_CODEC, 3U), /*!< CODEC i2c bus command transfer failed status */ |
| }; |
| |
| /*! @brief AUDIO format definition. */ |
| typedef enum _codec_audio_protocol |
| { |
| kCODEC_BusI2S = 0U, /*!< I2S type */ |
| kCODEC_BusLeftJustified = 1U, /*!< Left justified mode */ |
| kCODEC_BusRightJustified = 2U, /*!< Right justified mode */ |
| kCODEC_BusPCMA = 3U, /*!< DSP/PCM A mode */ |
| kCODEC_BusPCMB = 4U, /*!< DSP/PCM B mode */ |
| kCODEC_BusTDM = 5U, /*!< TDM mode */ |
| } codec_audio_protocol_t; |
| |
| /*! @brief audio sample rate definition */ |
| enum _codec_audio_sample_rate |
| { |
| kCODEC_AudioSampleRate8KHz = 8000U, /*!< Sample rate 8000 Hz */ |
| kCODEC_AudioSampleRate11025Hz = 11025U, /*!< Sample rate 11025 Hz */ |
| kCODEC_AudioSampleRate12KHz = 12000U, /*!< Sample rate 12000 Hz */ |
| kCODEC_AudioSampleRate16KHz = 16000U, /*!< Sample rate 16000 Hz */ |
| kCODEC_AudioSampleRate22050Hz = 22050U, /*!< Sample rate 22050 Hz */ |
| kCODEC_AudioSampleRate24KHz = 24000U, /*!< Sample rate 24000 Hz */ |
| kCODEC_AudioSampleRate32KHz = 32000U, /*!< Sample rate 32000 Hz */ |
| kCODEC_AudioSampleRate44100Hz = 44100U, /*!< Sample rate 44100 Hz */ |
| kCODEC_AudioSampleRate48KHz = 48000U, /*!< Sample rate 48000 Hz */ |
| kCODEC_AudioSampleRate96KHz = 96000U, /*!< Sample rate 96000 Hz */ |
| kCODEC_AudioSampleRate192KHz = 192000U, /*!< Sample rate 192000 Hz */ |
| kCODEC_AudioSampleRate384KHz = 384000U, /*!< Sample rate 384000 Hz */ |
| }; |
| |
| /*! @brief audio bit width */ |
| enum _codec_audio_bit_width |
| { |
| kCODEC_AudioBitWidth16bit = 16U, /*!< audio bit width 16 */ |
| kCODEC_AudioBitWidth20bit = 20U, /*!< audio bit width 20 */ |
| kCODEC_AudioBitWidth24bit = 24U, /*!< audio bit width 24 */ |
| kCODEC_AudioBitWidth32bit = 32U, /*!< audio bit width 32 */ |
| }; |
| |
| /*! @brief audio codec module*/ |
| typedef enum _codec_module |
| { |
| kCODEC_ModuleADC = 0U, /*!< codec module ADC */ |
| kCODEC_ModuleDAC = 1U, /*!< codec module DAC */ |
| kCODEC_ModulePGA = 2U, /*!< codec module PGA */ |
| kCODEC_ModuleHeadphone = 3U, /*!< codec module headphone */ |
| kCODEC_ModuleSpeaker = 4U, /*!< codec module speaker */ |
| kCODEC_ModuleLinein = 5U, /*!< codec module linein */ |
| kCODEC_ModuleLineout = 6U, /*!< codec module lineout */ |
| kCODEC_ModuleVref = 7U, /*!< codec module VREF */ |
| kCODEC_ModuleMicbias = 8U, /*!< codec module MIC BIAS */ |
| kCODEC_ModuleMic = 9U, /*!< codec module MIC */ |
| kCODEC_ModuleI2SIn = 10U, /*!< codec module I2S in */ |
| kCODEC_ModuleI2SOut = 11U, /*!< codec module I2S out */ |
| kCODEC_ModuleMxier = 12U, /*!< codec module mixer */ |
| } codec_module_t; |
| |
| /*! @brief audio codec module control cmd */ |
| typedef enum _codec_module_ctrl_cmd |
| { |
| kCODEC_ModuleSwitchI2SInInterface = 0U, /*!< module digital interface siwtch. */ |
| } codec_module_ctrl_cmd_t; |
| |
| /*! @brief audio codec module digital interface */ |
| enum _codec_module_ctrl_i2s_in_interface |
| { |
| kCODEC_ModuleI2SInInterfacePCM = 0U, /*!< Pcm interface*/ |
| kCODEC_ModuleI2SInInterfaceDSD = 1U, /*!< DSD interface */ |
| }; |
| |
| /*! @brief audio codec module record source value */ |
| enum _codec_record_source |
| { |
| kCODEC_RecordSourceDifferentialLine = 1U, /*!< record source from differential line */ |
| kCODEC_RecordSourceLineInput = 2U, /*!< record source from line input */ |
| kCODEC_RecordSourceDifferentialMic = 4U, /*!< record source from differential mic */ |
| kCODEC_RecordSourceDigitalMic = 8U, /*!< record source from digital microphone */ |
| kCODEC_RecordSourceSingleEndMic = 16U, /*!< record source from single microphone */ |
| }; |
| |
| /*! @brief audio codec record channel */ |
| enum _codec_reocrd_channel |
| { |
| kCODEC_RecordChannelLeft1 = 1U, /*!< left record channel 1 */ |
| kCODEC_RecordChannelLeft2 = 2U, /*!< left record channel 2 */ |
| kCODEC_RecordChannelLeft3 = 4U, /*!< left record channel 3 */ |
| kCODEC_RecordChannelRight1 = 1U, /*!< right record channel 1 */ |
| kCODEC_RecordChannelRight2 = 2U, /*!< right record channel 2 */ |
| kCODEC_RecordChannelRight3 = 4U, /*!< right record channel 3 */ |
| kCODEC_RecordChannelDifferentialPositive1 = 1U, /*!< differential positive record channel 1 */ |
| kCODEC_RecordChannelDifferentialPositive2 = 2U, /*!< differential positive record channel 2 */ |
| kCODEC_RecordChannelDifferentialPositive3 = 4U, /*!< differential positive record channel 3 */ |
| kCODEC_RecordChannelDifferentialNegative1 = 8U, /*!< differential negative record channel 1 */ |
| kCODEC_RecordChannelDifferentialNegative2 = 16U, /*!< differential negative record channel 2 */ |
| kCODEC_RecordChannelDifferentialNegative3 = 32U, /*!< differential negative record channel 3 */ |
| }; |
| |
| /*! @brief audio codec module play source value */ |
| enum _codec_play_source |
| { |
| kCODEC_PlaySourcePGA = 1U, /*!< play source PGA, bypass ADC */ |
| kCODEC_PlaySourceInput = 2U, /*!< play source Input3 */ |
| kCODEC_PlaySourceDAC = 4U, /*!< play source DAC */ |
| kCODEC_PlaySourceMixerIn = 1U, /*!< play source mixer in */ |
| kCODEC_PlaySourceMixerInLeft = 2U, /*!< play source mixer in left */ |
| kCODEC_PlaySourceMixerInRight = 4U, /*!< play source mixer in right */ |
| kCODEC_PlaySourceAux = 8U, /*!< play source mixer in AUx */ |
| }; |
| |
| /*! @brief codec play channel */ |
| enum _codec_play_channel |
| { |
| kCODEC_PlayChannelHeadphoneLeft = 1U, /*!< play channel headphone left */ |
| kCODEC_PlayChannelHeadphoneRight = 2U, /*!< play channel headphone right */ |
| kCODEC_PlayChannelSpeakerLeft = 4U, /*!< play channel speaker left */ |
| kCODEC_PlayChannelSpeakerRight = 8U, /*!< play channel speaker right */ |
| kCODEC_PlayChannelLineOutLeft = 16U, /*!< play channel lineout left */ |
| kCODEC_PlayChannelLineOutRight = 32U, /*!< play channel lineout right */ |
| |
| kCODEC_PlayChannelLeft0 = 1U, /*!< play channel left0 */ |
| kCODEC_PlayChannelRight0 = 2U, /*!< play channel right0 */ |
| kCODEC_PlayChannelLeft1 = 4U, /*!< play channel left1 */ |
| kCODEC_PlayChannelRight1 = 8U, /*!< play channel right1 */ |
| kCODEC_PlayChannelLeft2 = 16U, /*!< play channel left2 */ |
| kCODEC_PlayChannelRight2 = 32U, /*!< play channel right2 */ |
| kCODEC_PlayChannelLeft3 = 64U, /*!< play channel left3 */ |
| kCODEC_PlayChannelRight3 = 128U, /*!< play channel right3 */ |
| }; |
| |
| /*! @brief audio codec capability */ |
| enum _codec_capability_flag |
| { |
| kCODEC_SupportModuleADC = 1U << 0U, /*!< codec capability of module ADC */ |
| kCODEC_SupportModuleDAC = 1U << 1U, /*!< codec capability of module DAC */ |
| kCODEC_SupportModulePGA = 1U << 2U, /*!< codec capability of module PGA */ |
| kCODEC_SupportModuleHeadphone = 1U << 3U, /*!< codec capability of module headphone */ |
| kCODEC_SupportModuleSpeaker = 1U << 4U, /*!< codec capability of module speaker */ |
| kCODEC_SupportModuleLinein = 1U << 5U, /*!< codec capability of module linein */ |
| kCODEC_SupportModuleLineout = 1U << 6U, /*!< codec capability of module lineout */ |
| kCODEC_SupportModuleVref = 1U << 7U, /*!< codec capability of module vref */ |
| kCODEC_SupportModuleMicbias = 1U << 8U, /*!< codec capability of module mic bias */ |
| kCODEC_SupportModuleMic = 1U << 9U, /*!< codec capability of module mic bias */ |
| kCODEC_SupportModuleI2SIn = 1U << 10U, /*!< codec capability of module I2S in */ |
| kCODEC_SupportModuleI2SOut = 1U << 11U, /*!< codec capability of module I2S out */ |
| kCODEC_SupportModuleMixer = 1U << 12U, /*!< codec capability of module mixer */ |
| kCODEC_SupportModuleI2SInSwitchInterface = 1U << 13U, /*!< codec capability of module I2S in switch interface */ |
| |
| kCODEC_SupportPlayChannelLeft0 = 1U << 0U, /*!< codec capability of play channel left 0 */ |
| kCODEC_SupportPlayChannelRight0 = 1U << 1U, /*!< codec capability of play channel right 0 */ |
| kCODEC_SupportPlayChannelLeft1 = 1U << 2U, /*!< codec capability of play channel left 1 */ |
| kCODEC_SupportPlayChannelRight1 = 1U << 3U, /*!< codec capability of play channel right 1 */ |
| kCODEC_SupportPlayChannelLeft2 = 1U << 4U, /*!< codec capability of play channel left 2 */ |
| kCODEC_SupportPlayChannelRight2 = 1U << 5U, /*!< codec capability of play channel right 2 */ |
| kCODEC_SupportPlayChannelLeft3 = 1U << 6U, /*!< codec capability of play channel left 3 */ |
| kCODEC_SupportPlayChannelRight3 = 1U << 7U, /*!< codec capability of play channel right 3 */ |
| |
| kCODEC_SupportPlaySourcePGA = 1U << 8U, /*!< codec capability of set playback source PGA */ |
| kCODEC_SupportPlaySourceInput = 1U << 9U, /*!< codec capability of set playback source INPUT */ |
| kCODEC_SupportPlaySourceDAC = 1U << 10U, /*!< codec capability of set playback source DAC */ |
| kCODEC_SupportPlaySourceMixerIn = 1U << 11U, /*!< codec capability of set play source Mixer in */ |
| kCODEC_SupportPlaySourceMixerInLeft = 1U << 12U, /*!< codec capability of set play source Mixer in left */ |
| kCODEC_SupportPlaySourceMixerInRight = 1U << 13U, /*!< codec capability of set play source Mixer in right */ |
| kCODEC_SupportPlaySourceAux = 1U << 14U, /*!< codec capability of set play source aux */ |
| |
| kCODEC_SupportRecordSourceDifferentialLine = 1U << 0U, /*!< codec capability of record source differential line */ |
| kCODEC_SupportRecordSourceLineInput = 1U << 1U, /*!< codec capability of record source line input */ |
| kCODEC_SupportRecordSourceDifferentialMic = 1U << 2U, /*!< codec capability of record source differential mic */ |
| kCODEC_SupportRecordSourceDigitalMic = 1U << 3U, /*!< codec capability of record digital mic */ |
| kCODEC_SupportRecordSourceSingleEndMic = 1U << 4U, /*!< codec capability of single end mic */ |
| kCODEC_SupportRecordChannelLeft1 = 1U << 6U, /*!< left record channel 1 */ |
| kCODEC_SupportRecordChannelLeft2 = 1U << 7U, /*!< left record channel 2 */ |
| kCODEC_SupportRecordChannelLeft3 = 1U << 8U, /*!< left record channel 3 */ |
| kCODEC_SupportRecordChannelRight1 = 1U << 9U, /*!< right record channel 1 */ |
| kCODEC_SupportRecordChannelRight2 = 1U << 10U, /*!< right record channel 2 */ |
| kCODEC_SupportRecordChannelRight3 = 1U << 11U, /*!< right record channel 3 */ |
| }; |
| |
| /*!@brief codec handle declaration */ |
| typedef struct _codec_handle codec_handle_t; |
| |
| /*! @brief Initialize structure of the codec */ |
| typedef struct _codec_config |
| { |
| uint32_t codecDevType; /*!< codec type */ |
| void *codecDevConfig; /*!< Codec device specific configuration */ |
| } codec_config_t; |
| |
| /*! @brief codec capability */ |
| typedef struct _codec_capability |
| { |
| uint32_t codecModuleCapability; /*!< codec module capability */ |
| uint32_t codecPlayCapability; /*!< codec play capability */ |
| uint32_t codecRecordCapability; /*!< codec record capability */ |
| } codec_capability_t; |
| |
| /*! @brief Codec handle definition. |
| * * Application should allocate a buffer with CODEC_HANDLE_SIZE for handle definition, such as |
| * uint8_t codecHandleBuffer[CODEC_HANDLE_SIZE]; |
| * codec_handle_t *codecHandle = codecHandleBuffer; |
| */ |
| struct _codec_handle |
| { |
| codec_config_t *codecConfig; /*!< codec configuration function pointer */ |
| const codec_capability_t *codecCapability; /*!< codec capability */ |
| uint8_t codecDevHandle[HAL_CODEC_HANDLER_SIZE]; /*!< codec device handle */ |
| }; |
| |
| /******************************************************************************* |
| * API |
| ******************************************************************************/ |
| |
| #if defined(__cplusplus) |
| extern "C" { |
| #endif |
| /*! |
| * @brief Codec initilization. |
| * |
| * @param handle codec handle. |
| * @param config codec configurations. |
| * @return kStatus_Success is success, else de-initial failed. |
| */ |
| status_t CODEC_Init(codec_handle_t *handle, codec_config_t *config); |
| |
| /*! |
| * @brief Codec de-initilization. |
| * |
| * @param handle codec handle. |
| * @return kStatus_Success is success, else de-initial failed. |
| */ |
| status_t CODEC_Deinit(codec_handle_t *handle); |
| |
| /*! |
| * @brief set audio data format. |
| * |
| * @param handle codec handle. |
| * @param mclk master clock frequency in HZ. |
| * @param sampleRate sample rate in HZ. |
| * @param bitWidth bit width. |
| * @return kStatus_Success is success, else configure failed. |
| */ |
| status_t CODEC_SetFormat(codec_handle_t *handle, uint32_t mclk, uint32_t sampleRate, uint32_t bitWidth); |
| |
| /*! |
| * @brief codec module control. |
| * |
| * This function is used for codec module control, support switch digital interface cmd, can be expand to support codec |
| * module specific feature. |
| * |
| * @param handle codec handle. |
| * @param cmd module control cmd, reference _codec_module_ctrl_cmd. |
| * @param data value to write, when cmd is kCODEC_ModuleRecordSourceChannel, the data should be a value combine |
| * of channel and source, please reference macro CODEC_MODULE_RECORD_SOURCE_CHANNEL(source, LP, LN, RP, RN), reference |
| * codec specific driver for detail configurations. |
| * @return kStatus_Success is success, else configure failed. |
| */ |
| status_t CODEC_ModuleControl(codec_handle_t *handle, codec_module_ctrl_cmd_t cmd, uint32_t data); |
| |
| /*! |
| * @brief set audio codec pl volume. |
| * |
| * @param handle codec handle. |
| * @param channel audio codec play channel, can be a value or combine value of _codec_play_channel. |
| * @param volume volume value, support 0 ~ 100, 0 is mute, 100 is the maximum volume value. |
| * @return kStatus_Success is success, else configure failed. |
| */ |
| status_t CODEC_SetVolume(codec_handle_t *handle, uint32_t channel, uint32_t volume); |
| |
| /*! |
| * @brief set audio codec module mute. |
| * |
| * @param handle codec handle. |
| * @param channel audio codec play channel, can be a value or combine value of _codec_play_channel. |
| * @param mute true is mute, false is unmute. |
| * @return kStatus_Success is success, else configure failed. |
| */ |
| status_t CODEC_SetMute(codec_handle_t *handle, uint32_t channel, bool mute); |
| |
| /*! |
| * @brief set audio codec power. |
| * |
| * @param handle codec handle. |
| * @param module audio codec module. |
| * @param powerOn true is power on, false is power down. |
| * @return kStatus_Success is success, else configure failed. |
| */ |
| status_t CODEC_SetPower(codec_handle_t *handle, codec_module_t module, bool powerOn); |
| |
| /*! |
| * @brief codec set record source. |
| * |
| * @param handle codec handle. |
| * @param recordRource audio codec record source, can be a value or combine value of _codec_record_source. |
| * |
| * @return kStatus_Success is success, else configure failed. |
| */ |
| status_t CODEC_SetRecord(codec_handle_t *handle, uint32_t recordRource); |
| |
| /*! |
| * @brief codec set record channel. |
| * |
| * @param handle codec handle. |
| * @param leftRecordChannel audio codec record channel, reference _codec_record_channel, can be a value combine of |
| member in _codec_record_channel. |
| * @param rightRecordChannel audio codec record channel, reference _codec_record_channel, can be a value combine of |
| member in _codec_record_channel. |
| |
| * @return kStatus_Success is success, else configure failed. |
| */ |
| status_t CODEC_SetRecordChannel(codec_handle_t *handle, uint32_t leftRecordChannel, uint32_t rightRecordChannel); |
| |
| /*! |
| * @brief codec set play source. |
| * |
| * @param handle codec handle. |
| * @param playSource audio codec play source, can be a value or combine value of _codec_play_source. |
| * |
| * @return kStatus_Success is success, else configure failed. |
| */ |
| status_t CODEC_SetPlay(codec_handle_t *handle, uint32_t playSource); |
| |
| #if defined(__cplusplus) |
| } |
| #endif |
| /*! @} */ |
| |
| #endif /* _FSL_CODEC_COMMON_H_ */ |