239 lines
7.7 KiB
C
239 lines
7.7 KiB
C
|
/*
|
||
|
* Copyright 2017-2019 NXP
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
*
|
||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||
|
*/
|
||
|
|
||
|
#include "fsl_codec_common.h"
|
||
|
#include "fsl_codec_adapter.h"
|
||
|
/*******************************************************************************
|
||
|
* Definitions
|
||
|
******************************************************************************/
|
||
|
/*! @brief codec play and record capability */
|
||
|
#define GET_PLAY_CHANNEL_CAPABILITY(capability) (capability & 0xFFU)
|
||
|
#define GET_PLAY_SOURCE_CAPABILITY(capability) (capability >> 8U)
|
||
|
#define GET_RECORD_SOURCE_CAPABILITY(capability) (capability & 0x3FU)
|
||
|
#define GET_RECORD_CHANNEL_CAPABILITY(capability) (capability >> 6U)
|
||
|
/*******************************************************************************
|
||
|
* Variables
|
||
|
******************************************************************************/
|
||
|
|
||
|
/*******************************************************************************
|
||
|
* Code
|
||
|
******************************************************************************/
|
||
|
/*!
|
||
|
* brief Codec initilization.
|
||
|
*
|
||
|
* param handle codec handle.
|
||
|
* param config codec configuration.
|
||
|
* return kStatus_Success is success, else initial failed.
|
||
|
*/
|
||
|
status_t CODEC_Init(codec_handle_t *handle, codec_config_t *config)
|
||
|
{
|
||
|
assert((config != NULL) && (handle != NULL));
|
||
|
|
||
|
/* Set the handle information */
|
||
|
handle->codecConfig = config;
|
||
|
|
||
|
return HAL_CODEC_Init(handle, 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)
|
||
|
{
|
||
|
assert((handle != NULL) && (handle->codecConfig != NULL));
|
||
|
|
||
|
return HAL_CODEC_Deinit(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)
|
||
|
{
|
||
|
assert((handle != NULL) && (handle->codecConfig != NULL));
|
||
|
|
||
|
return HAL_CODEC_SetFormat(handle, mclk, sampleRate, 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)
|
||
|
{
|
||
|
assert((handle != NULL) && (handle->codecConfig != NULL));
|
||
|
|
||
|
switch (cmd)
|
||
|
{
|
||
|
case kCODEC_ModuleSwitchI2SInInterface:
|
||
|
if ((handle->codecCapability.codecModuleCapability & kCODEC_SupportModuleI2SInSwitchInterface) == 0U)
|
||
|
{
|
||
|
return kStatus_CODEC_NotSupport;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return kStatus_CODEC_NotSupport;
|
||
|
}
|
||
|
|
||
|
return HAL_CODEC_ModuleControl(handle, cmd, data);
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* brief set audio codec module 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 playChannel, uint32_t volume)
|
||
|
{
|
||
|
assert((handle != NULL) && (handle->codecConfig != NULL));
|
||
|
assert(volume <= CODEC_VOLUME_MAX_VALUE);
|
||
|
|
||
|
/* check capability of set volume */
|
||
|
if ((GET_PLAY_CHANNEL_CAPABILITY(handle->codecCapability.codecPlayCapability) & playChannel) == 0U)
|
||
|
{
|
||
|
return kStatus_CODEC_NotSupport;
|
||
|
}
|
||
|
|
||
|
return HAL_CODEC_SetVolume(handle, playChannel, 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 playChannel, bool mute)
|
||
|
{
|
||
|
assert((handle != NULL) && (handle->codecConfig != NULL));
|
||
|
|
||
|
/* check capability of mute */
|
||
|
if ((GET_PLAY_CHANNEL_CAPABILITY(handle->codecCapability.codecPlayCapability) & playChannel) == 0U)
|
||
|
{
|
||
|
return kStatus_CODEC_NotSupport;
|
||
|
}
|
||
|
|
||
|
return HAL_CODEC_SetMute(handle, playChannel, mute);
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* brief set audio codec module 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)
|
||
|
{
|
||
|
assert((handle != NULL) && (handle->codecConfig != NULL));
|
||
|
|
||
|
/* check capability of power switch */
|
||
|
if ((handle->codecCapability.codecModuleCapability & (1U << module)) == 0U)
|
||
|
{
|
||
|
return kStatus_CODEC_NotSupport;
|
||
|
}
|
||
|
|
||
|
return HAL_CODEC_SetPower(handle, module, 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 recordSource)
|
||
|
{
|
||
|
assert((handle != NULL) && (handle->codecConfig != NULL));
|
||
|
|
||
|
/* check capability of record capability */
|
||
|
if ((GET_RECORD_SOURCE_CAPABILITY(handle->codecCapability.codecRecordCapability) & recordSource) == 0U)
|
||
|
{
|
||
|
return kStatus_CODEC_NotSupport;
|
||
|
}
|
||
|
|
||
|
return HAL_CODEC_SetRecord(handle, recordSource);
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
* brief codec set record channel.
|
||
|
*
|
||
|
* param handle codec handle.
|
||
|
* param leftRecordChannel audio codec record channel, reference _codec_record_channel, can be a value or combine value
|
||
|
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)
|
||
|
{
|
||
|
assert((handle != NULL) && (handle->codecConfig != NULL));
|
||
|
|
||
|
/* check capability of record capability */
|
||
|
if ((GET_RECORD_CHANNEL_CAPABILITY(handle->codecCapability.codecRecordCapability) & leftRecordChannel) == 0U)
|
||
|
{
|
||
|
return kStatus_CODEC_NotSupport;
|
||
|
}
|
||
|
|
||
|
if ((GET_RECORD_CHANNEL_CAPABILITY(handle->codecCapability.codecRecordCapability) & rightRecordChannel) == 0U)
|
||
|
{
|
||
|
return kStatus_CODEC_NotSupport;
|
||
|
}
|
||
|
|
||
|
return HAL_CODEC_SetRecordChannel(handle, leftRecordChannel, 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)
|
||
|
{
|
||
|
assert((handle != NULL) && (handle->codecConfig != NULL));
|
||
|
|
||
|
/* check capability of record capability */
|
||
|
if ((GET_PLAY_SOURCE_CAPABILITY(handle->codecCapability.codecPlayCapability) & playSource) == 0U)
|
||
|
{
|
||
|
return kStatus_CODEC_NotSupport;
|
||
|
}
|
||
|
|
||
|
return HAL_CODEC_SetPlay(handle, playSource);
|
||
|
}
|