blob: 19df679b28cdf70f5a425db298bd8fdc982dcc6a [file] [log] [blame]
/*
* 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_ */