123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363 |
- /*
- * 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"
- /*******************************************************************************
- * Definitions
- ******************************************************************************/
- /*! @name Driver version */
- /*@{*/
- /*! @brief CLOCK driver version 2.1.0. */
- #define FSL_CODEC_DRIVER_VERSION (MAKE_VERSION(2, 1, 0))
- /*@}*/
- /*! @brief CODEC handle buffer size */
- #ifndef CODEC_HANDLE_SIZE
- #define CODEC_HANDLE_SIZE (128U)
- #endif
- /*! @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 */
- codec_capability_t codecCapability; /*!< codec capability */
- void *codecDevHandle; /*!< 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 source 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_ */
|