123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- /*
- * The Clear BSD License
- * Copyright (c) 2016, Freescale Semiconductor, Inc.
- * Copyright 2016-2017 NXP
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted (subject to the limitations in the disclaimer below) provided
- * that the following conditions are met:
- *
- * o Redistributions of source code must retain the above copyright notice, this list
- * of conditions and the following disclaimer.
- *
- * o Redistributions in binary form must reproduce the above copyright notice, this
- * list of conditions and the following disclaimer in the documentation and/or
- * other materials provided with the distribution.
- *
- * o Neither the name of the copyright holder nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE.
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Change Logs:
- * Date Author Notes
- * 2019-11-09 LiWeiHao Porting to RT-Thread
- */
- #ifndef _FSL_WM8904_H_
- #define _FSL_WM8904_H_
- #include "fsl_common.h"
- #include "rtdevice.h"
- #include "rtthread.h"
- /*!
- * @addtogroup wm8904
- * @{
- */
- /*******************************************************************************
- * Definitions
- ******************************************************************************/
- /*! @brief WM8904 I2C address. */
- #define WM8904_I2C_ADDRESS (0x1A)
- /*! @brief WM8904 I2C bit rate. */
- #define WM8904_I2C_BITRATE (400000U)
- /*! @brief WM8904 status return codes. */
- enum _wm8904_status
- {
- kStatus_WM8904_Success = 0x0, /*!< Success */
- kStatus_WM8904_Fail = 0x1 /*!< Failure */
- };
- /*! @brief The audio data transfer protocol. */
- typedef enum _wm8904_protocol
- {
- kWM8904_ProtocolRightJustified = 0x0, /*!< Right justified mode */
- kWM8904_ProtocolLeftJustified = 0x1, /*!< Left justified mode */
- kWM8904_ProtocolI2S = 0x2, /*!< I2S mode */
- kWM8904_ProtocolDSP = 0x3 /*!< DSP mode */
- } wm8904_protocol_t;
- /*! @brief The SYSCLK / fs ratio. */
- typedef enum _wm8904_fs_ratio
- {
- kWM8904_FsRatio64X = 0x0, /*!< SYSCLK is 64 * sample rate * frame width */
- kWM8904_FsRatio128X = 0x1, /*!< SYSCLK is 128 * sample rate * frame width */
- kWM8904_FsRatio192X = 0x2, /*!< SYSCLK is 192 * sample rate * frame width */
- kWM8904_FsRatio256X = 0x3, /*!< SYSCLK is 256 * sample rate * frame width */
- kWM8904_FsRatio384X = 0x4, /*!< SYSCLK is 384 * sample rate * frame width */
- kWM8904_FsRatio512X = 0x5, /*!< SYSCLK is 512 * sample rate * frame width */
- kWM8904_FsRatio768X = 0x6, /*!< SYSCLK is 768 * sample rate * frame width */
- kWM8904_FsRatio1024X = 0x7, /*!< SYSCLK is 1024 * sample rate * frame width */
- kWM8904_FsRatio1408X = 0x8, /*!< SYSCLK is 1408 * sample rate * frame width */
- kWM8904_FsRatio1536X = 0x9 /*!< SYSCLK is 1536 * sample rate * frame width */
- } wm8904_fs_ratio_t;
- /*! @brief Sample rate. */
- typedef enum _wm8904_sample_rate
- {
- kWM8904_SampleRate8kHz = 0x0, /*!< 8 kHz */
- kWM8904_SampleRate12kHz = 0x1, /*!< 11.025kHz, 12kHz */
- kWM8904_SampleRate16kHz = 0x2, /*!< 16kHz */
- kWM8904_SampleRate24kHz = 0x3, /*!< 22.05kHz, 24kHz */
- kWM8904_SampleRate32kHz = 0x4, /*!< 32kHz */
- kWM8904_SampleRate48kHz = 0x5 /*!< 44.1kHz, 48kHz */
- } wm8904_sample_rate_t;
- /*! @brief Bit width. */
- typedef enum _wm8904_bit_width
- {
- kWM8904_BitWidth16 = 0x0, /*!< 16 bits */
- kWM8904_BitWidth20 = 0x1, /*!< 20 bits */
- kWM8904_BitWidth24 = 0x2, /*!< 24 bits */
- kWM8904_BitWidth32 = 0x3 /*!< 32 bits */
- } wm8904_bit_width_t;
- /*! @brief Audio format configuration. */
- typedef struct _wm8904_audio_format
- {
- wm8904_fs_ratio_t fsRatio; /*!< SYSCLK / fs ratio */
- wm8904_sample_rate_t sampleRate; /*!< Sample rate */
- wm8904_bit_width_t bitWidth; /*!< Bit width */
- } wm8904_audio_format_t;
- /*! @brief WM8904 data. */
- typedef struct _wm8904_handle
- {
- struct rt_i2c_bus_device *i2c; /*!< Configured I2C instance */
- } wm8904_handle_t;
- /*! @brief Configuration structure of WM8904. */
- typedef struct _wm8904_config
- {
- bool master; /*!< Master or slave */
- wm8904_protocol_t protocol; /*!< Audio transfer protocol */
- wm8904_audio_format_t format; /*!< Audio format */
- } wm8904_config_t;
- /*******************************************************************************
- * API
- ******************************************************************************/
- #if defined(__cplusplus)
- extern "C"
- {
- #endif
- /*!
- * @brief Initializes WM8904.
- *
- * @param handle WM8904 handle structure.
- * @param codec_config WM8904 configuration structure.
- */
- status_t WM8904_Init(wm8904_handle_t *handle, wm8904_config_t *config);
- /*!
- * @brief Deinitializes the WM8904 codec.
- *
- * This function resets WM8904.
- *
- * @param handle WM8904 handle structure.
- *
- * @return kStatus_WM8904_Success if successful, different code otherwise.
- */
- status_t WM8904_Deinit(wm8904_handle_t *handle);
- /*!
- * @brief Fills the configuration structure with default values.
- *
- * The default values are:
- *
- * master = false;
- * protocol = kWM8904_ProtocolI2S;
- * format.fsRatio = kWM8904_FsRatio64X;
- * format.sampleRate = kWM8904_SampleRate48kHz;
- * format.bitWidth = kWM8904_BitWidth16;
- *
- * @param handle WM8904 handle structure to be filled with default values.
- */
- void WM8904_GetDefaultConfig(wm8904_config_t *config);
- /*!
- * @brief Sets WM8904 as master or slave.
- *
- * @param handle WM8904 handle structure.
- * @param master true for master, false for slave.
- *
- * @return kStatus_WM8904_Success if successful, different code otherwise.
- */
- status_t WM8904_SetMasterSlave(wm8904_handle_t *handle, bool master);
- /*!
- * @brief Sets the audio data transfer protocol.
- *
- * @param handle WM8904 handle structure.
- * @param protocol Audio transfer protocol.
- *
- * @return kStatus_WM8904_Success if successful, different code otherwise.
- */
- status_t WM8904_SetProtocol(wm8904_handle_t *handle, wm8904_protocol_t protocol);
- /*!
- * @brief Sets the audio data format.
- *
- * @param handle WM8904 handle structure.
- * @param format Audio format parameters.
- *
- * @return kStatus_WM8904_Success if successful, different code otherwise.
- */
- status_t WM8904_SetAudioFormat(wm8904_handle_t *handle, wm8904_audio_format_t *format);
- /*!
- * @brief Sets the headphone output volume.
- *
- * The parameter should be from 0 to 63.
- * The resulting volume will be (parameter - 57 dB).
- * 0 for -57 dB, 57 for 0 dB, 63 for +6 dB etc.
- *
- * @param handle WM8904 handle structure.
- * @param volumeLeft Volume of the left channel.
- * @param volumeRight Volume of the right channel.
- *
- * @return kStatus_WM8904_Success if successful, different code otherwise.
- */
- status_t WM8904_SetVolume(wm8904_handle_t *handle, uint16_t volumeLeft, uint16_t volumeRight);
- /*!
- * @brief Sets the headphone output mute.
- *
- * @param handle WM8904 handle structure.
- * @param muteLeft true to mute left channel, false to unmute.
- * @param muteRight true to mute right channel, false to unmute.
- *
- * @return kStatus_WM8904_Success if successful, different code otherwise.
- */
- status_t WM8904_SetMute(wm8904_handle_t *handle, bool muteLeft, bool muteRight);
- /*!
- * @brief Reads content of all WM8904 registers and prints it to debug console.
- *
- * @param handle WM8904 handle structure.
- *
- * @return kStatus_WM8904_Success if successful, different code otherwise.
- */
- status_t WM8904_PrintRegisters(wm8904_handle_t *handle);
- #if defined(__cplusplus)
- }
- #endif
- /*! @} */
- #endif /* _FSL_WM8904_H_ */
|