incubator-nuttx/drivers/audio/cs43l22.h

389 lines
24 KiB
C

/****************************************************************************
* drivers/audio/cs43l22.h
*
* Copyright (C) 2017 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Reference:
* "CS43L22 Ultra Low Power CODEC for Portable Audio Applications, Pre-
* Production", September 2012, Rev 3.3, Wolfson Microelectronics
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* 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 OWNER 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.
*
****************************************************************************/
#ifndef __DRIVERS_AUDIO_CS43L22_H
#define __DRIVERS_AUDIO_CS43L22_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <nuttx/compiler.h>
#include <pthread.h>
#include <mqueue.h>
#include <nuttx/wqueue.h>
#include <nuttx/fs/ioctl.h>
#define getreg32(a) (*(volatile uint32_t *)(a))
#define putreg32(v,a) (*(volatile uint32_t *)(a) = (v))
#define getreg16(a) (*(volatile uint16_t *)(a))
#define putreg16(v,a) (*(volatile uint16_t *)(a) = (v))
#ifdef CONFIG_AUDIO
/****************************************************************************
* Pre-Processor Definitions
****************************************************************************/
/* So far, I have not been able to get FLL lock interrupts. Worse, I have
* been able to get the FLL to claim that it is locked at all even when
* polling. What am I doing wrong?
*
* Hmmm.. seems unnecessary anyway
*/
#undef CS43L22_USE_FFLOCK_INT
#undef CS43L22_USE_FFLOCK_POLL
/* Registers Addresses ******************************************************/
#define CS43L22_ID_REV 0x01 /* Chip I.D. and Revision */
#define CS43L22_POWER_CTRL1 0x02 /* Power Control 1 */
#define CS43L22_POWER_CTRL2 0x04 /* Power Control 2 */
#define CS43L22_CLOCK_CTRL 0x05 /* Clocking Control */
#define CS43L22_INTERFACE_CTRL1 0x06 /* Interface Control 1 */
#define CS43L22_INTERFACE_CTRL2 0x07 /* Interface Control 2 */
#define CS43L22_PASS_SEL_A 0x08 /* Passthrough x Select: PassA */
#define CS43L22_PASS_SEL_B 0x09 /* Passthrough x Select: PassB */
#define CS43L22_ANLG_ZC_SR_SEL 0x0A /* Analog ZC and SR Settings */
#define CS43L22_PASS_GANG_CTRL 0x0C /* Passthrough Gang Control */
#define CS43L22_PLAYBACK_CTRL1 0x0D /* Playback Control 1 */
#define CS43L22_MISCLLNS_CTRL 0x0E /* Miscellaneous Controls */
#define CS43L22_PLAYBACK_CTRL2 0x0F /* Playback Control 2 */
#define CS43L22_PASS_VOL_A 0x14 /* Passthrough x Volume: PASSAVOL */
#define CS43L22_PASS_VOL_B 0x15 /* Passthrough x Volume: PASSBVOL */
#define CS43L22_PCM_VOL_A 0x1A /* PCMx Volume: PCMA */
#define CS43L22_PCM_VOL_B 0x1B /* PCMx Volume: PCMB */
#define CS43L22_BP_FREQ_ON_TIME 0x1C /* Beep Frequency & On Time */
#define CS43L22_BP_VOL_OFF_TIME 0x1D /* Beep Volume & Off Time */
#define CS43L22_BP_TONE_CFG 0x1E /* Beep & Tone Configuration */
#define CS43L22_TONE_CTRL 0x1F /* Tone Control */
#define CS43L22_MS_VOL_CTRL_A 0x20 /* Master Volume Control: MSTA */
#define CS43L22_MS_VOL_CTRL_B 0x21 /* Master Volume Control: MSTB */
#define CS43L22_HP_VOL_CTRL_A 0x22 /* Headphone Volume Control: HPA */
#define CS43L22_HP_VOL_CTRL_B 0x23 /* Headphone Volume Control: HPB */
#define CS43L22_SPK_VOL_CTRL_A 0x24 /* Speaker Volume Control: SPKA */
#define CS43L22_SPK_VOL_CTRL_B 0x25 /* Speaker Volume Control: SPKB */
#define CS43L22_PCM_CH_SWAP 0x26 /* PCM Channel Swap */
#define CS43L22_LIM_CTRL1 0x27 /* Limiter Control 1, Min/Max Thresholds */
#define CS43L22_LIM_CTRL2 0x28 /* Limiter Control 2, Release Rate */
#define CS43L22_LIM_ATTACK_RATE 0x29 /* Limiter Attack Rate */
#define CS43L22_STATUS 0x2E /* Status */
#define CS43L22_BAT_COMP 0x2F /* Battery Compensation */
#define CS43L22_VP_BAT_LEVEL 0x30 /* VP Battery Level */
#define CS43L22_SPK_STATUS 0x31 /* Speaker Status */
#define CS43L22_TEMP_MON_CTRL 0x32 /* Temperature Monitor Control */
#define CS43L22_THERMAL_FOLDBACK 0x33 /* Thermal Foldback */
#define CS43L22_CHRG_PUMP_FREQ 0x34 /* Charge Pump Frequency */
#define CS43L22_HPBMUTE (1 << 7)
#define CS43L22_HPAMUTE (1 << 6)
#define CS43L22_SPKBMUTE (1 << 5)
#define CS43L22_SPKAMUTE (1 << 4)
/* Register Default Values **************************************************/
/* Registers have some undocumented bits set on power up. These probably
* should be retained on writes (?).
*/
#define CS43L22_ID_REV_DEFAULT 0xe3 /* Chip I.D. and Revision */
#define CS43L22_POWER_CTRL1_DEFAULT 0x01 /* Power Control 1 */
#define CS43L22_POWER_CTRL2_DEFAULT 0x05 /* Power Control 2 */
#define CS43L22_CLOCK_CTRL_DEFAULT 0xa0 /* Clocking Control */
#define CS43L22_INTERFACE_CTRL1_DEFAULT 0x00 /* Interface Control 1 */
#define CS43L22_INTERFACE_CTRL2_DEFAULT 0x00 /* Interface Control 2 */
#define CS43L22_PASS_SEL_A_DEFAULT 0x81 /* Passthrough x Select: PassA */
#define CS43L22_PASS_SEL_B_DEFAULT 0x81 /* Passthrough x Select: PassB */
#define CS43L22_ANLG_ZC_SR_SEL_DEFAULT 0xa5 /* Analog ZC and SR Settings */
#define CS43L22_PASS_GANG_CTRL_DEFAULT 0x00 /* Passthrough Gang Control */
#define CS43L22_PLAYBACK_CTRL1_DEFAULT 0x60 /* Playback Control 1 */
#define CS43L22_MISCLLNS_CTRL_DEFAULT 0x02 /* Miscellaneous Controls */
#define CS43L22_PLAYBACK_CTRL2_DEFAULT 0x00 /* Playback Control 2 */
#define CS43L22_PASS_VOL_A_DEFAULT 0x00 /* Passthrough x Volume: PASSAVOL */
#define CS43L22_PASS_VOL_B_DEFAULT 0x00 /* Passthrough x Volume: PASSBVOL */
#define CS43L22_PCM_VOL_A_DEFAULT 0x00 /* PCMx Volume: PCMA */
#define CS43L22_PCM_VOL_B_DEFAULT 0x00 /* PCMx Volume: PCMB */
#define CS43L22_BP_FREQ_ON_TIME_DEFAULT 0x00 /* Beep Frequency & On Time */
#define CS43L22_BP_VOL_OFF_TIME_DEFAULT 0x00 /* Beep Volume & Off Time */
#define CS43L22_BP_TONE_CFG_DEFAULT 0x00 /* Beep & Tone Configuration */
#define CS43L22_TONE_CTRL_DEFAULT 0x88 /* Tone Control */
#define CS43L22_MS_VOL_CTRL_A_DEFAULT 0x00 /* Master Volume Control: MSTA */
#define CS43L22_MS_VOL_CTRL_B_DEFAULT 0x00 /* Master Volume Control: MSTB */
#define CS43L22_HP_VOL_CTRL_A_DEFAULT 0x00 /* Headphone Volume Control: HPA */
#define CS43L22_HP_VOL_CTRL_B_DEFAULT 0x00 /* Headphone Volume Control: HPB */
#define CS43L22_SPK_VOL_CTRL_A_DEFAULT 0x00 /* Speaker Volume Control: SPKA */
#define CS43L22_SPK_VOL_CTRL_B_DEFAULT 0x00 /* Speaker Volume Control: SPKB */
#define CS43L22_PCM_CH_SWAP_DEFAULT 0x00 /* PCM Channel Swap */
#define CS43L22_LIM_CTRL1_DEFAULT 0x00 /* Limiter Control 1, Min/Max Thresholds */
#define CS43L22_LIM_CTRL2_DEFAULT 0x7f /* Limiter Control 2, Release Rate */
#define CS43L22_LIM_ATTACK_RATE_DEFAULT 0xc0 /* Limiter Attack Rate */
#define CS43L22_STATUS_DEFAULT 0x00 /* Status */
#define CS43L22_BAT_COMP_DEFAULT 0x00 /* Battery Compensation */
#define CS43L22_VP_BAT_LEVEL_DEFAULT 0x00 /* VP Battery Level */
#define CS43L22_SPK_STATUS_DEFAULT 0x00 /* Speaker Status */
#define CS43L22_TEMP_MON_CTRL_DEFAULT 0x3b /* Temperature Monitor Control */
#define CS43L22_THERMAL_FOLDBACK_DEFAULT 0x00 /* Thermal Foldback */
#define CS43L22_CHRG_PUMP_FREQ_DEFAULT 0x5f /* Charge Pump Frequency */
/* Register Bit Definitions *************************************************/
/* 0x01 Chip I.D. and Revision (Read Only) */
#define CS43L22_DEV_ID_REV (0xe3)
#define CS43L22_ID_SHIFT (3)
#define CS43L22_ID_MASK (0x1f << CS43L22_ID_SHIFT)
#define CS43L22_REV_SHIFT (0)
#define CS43L22_REV_MASK (0x07 << CS43L22_REV_SHIFT)
/* 0x02 Power Control 1 */
#define CS43L22_POWER_DOWN (0x01) /* Powered Down */
#define CS43L22_POWER_UP (0x9e) /* Powered Up */
/* 0x04 Power Control 2 */
#define CS43L22_PDN_HPB_SHIFT (6) /* Bits 6-7: Headphone channel B Control */
#define CS43L22_PDN_HPB_ON_HW_PIN_LO (0 << CS43L22_PDN_HPB_SHIFT) /* PDN_HPx[1:0] 00 Headphone channel is ON when the SPK/HP_SW pin, 6, is LO
Headphone channel is OFF when the SPK/HP_SW pin, 6, is HI */
#define CS43L22_PDN_HPB_ON_HW_PIN_HI (1 << CS43L22_PDN_HPB_SHIFT) /* PDN_HPx[1:0] 01 Headphone channel is ON when the SPK/HP_SW pin, 6, is HI
Headphone channel is OFF when the SPK/HP_SW pin, 6, is LO */
#define CS43L22_PDN_HPB_ON (2 << CS43L22_PDN_HPB_SHIFT) /* PDN_HPx[1:0] 10 Headphone channel is always ON */
#define CS43L22_PDN_HPB_OFF (3 << CS43L22_PDN_HPB_SHIFT) /* PDN_HPx[1:0] 11 Headphone channel is always OFF */
#define CS43L22_PDN_HPA_SHIFT (4) /* Bits 4-5: Headphone channel A Control */
#define CS43L22_PDN_HPA_ON_HW_PIN_LO (0 << CS43L22_PDN_HPA_SHIFT) /* PDN_HPx[1:0] 00 Headphone channel is ON when the SPK/HP_SW pin, 6, is LO
Headphone channel is OFF when the SPK/HP_SW pin, 6, is HI */
#define CS43L22_PDN_HPA_ON_HW_PIN_HI (1 << CS43L22_PDN_HPA_SHIFT) /* PDN_HPx[1:0] 01 Headphone channel is ON when the SPK/HP_SW pin, 6, is HI
Headphone channel is OFF when the SPK/HP_SW pin, 6, is LO */
#define CS43L22_PDN_HPA_ON (2 << CS43L22_PDN_HPA_SHIFT) /* PDN_HPx[1:0] 10 Headphone channel is always ON */
#define CS43L22_PDN_HPA_OFF (3 << CS43L22_PDN_HPA_SHIFT) /* PDN_HPx[1:0] 11 Headphone channel is always OFF */
#define CS43L22_PDN_SPKB_SHIFT (2) /* Bits 2-3: Speaker channel B Control */
#define CS43L22_PDN_SPKB_ON_HW_PIN_LO (0 << CS43L22_PDN_SPKB_SHIFT) /* PDN_HPx[1:0] 00 Speaker channel is ON when the SPK/HP_SW pin, 6, is LO
Speaker channel is OFF when the SPK/HP_SW pin, 6, is HI */
#define CS43L22_PDN_SPKB_ON_HW_PIN_HI (1 << CS43L22_PDN_SPKB_SHIFT) /* PDN_HPx[1:0] 01 Speaker channel is ON when the SPK/HP_SW pin, 6, is HI
Speaker channel is OFF when the SPK/HP_SW pin, 6, is LO */
#define CS43L22_PDN_SPKB_ON (2 << CS43L22_PDN_SPKB_SHIFT) /* PDN_HPx[1:0] 10 Speaker channel is always ON */
#define CS43L22_PDN_SPKB_OFF (3 << CS43L22_PDN_SPKB_SHIFT) /* PDN_HPx[1:0] 11 Speaker channel is always OFF */
#define CS43L22_PDN_SPKA_SHIFT (0) /* Bits 0-1: Speaker channel A Control */
#define CS43L22_PDN_SPKA_ON_HW_PIN_LO (0 << CS43L22_PDN_SPKA_SHIFT) /* PDN_HPx[1:0] 00 Speaker channel is ON when the SPK/HP_SW pin, 6, is LO
Speaker channel is OFF when the SPK/HP_SW pin, 6, is HI */
#define CS43L22_PDN_SPKA_ON_HW_PIN_HI (1 << CS43L22_PDN_SPKA_SHIFT) /* PDN_HPx[1:0] 01 Speaker channel is ON when the SPK/HP_SW pin, 6, is HI
Speaker channel is OFF when the SPK/HP_SW pin, 6, is LO */
#define CS43L22_PDN_SPKA_ON (2 << CS43L22_PDN_SPKA_SHIFT) /* PDN_HPx[1:0] 10 Speaker channel is always ON */
#define CS43L22_PDN_SPKA_OFF (3 << CS43L22_PDN_SPKA_SHIFT) /* PDN_HPx[1:0] 11 Speaker channel is always OFF */
/* 0x05 Clocking Control */
#define CS43L22_AUTO_DETECT_ENABLE (1 << 7) /* Auto-detection of speed mode enable */
#define CS43L22_SPEED_SHIFT (5) /* Bits 5-6: Speed mode */
#define CS43L22_SPEED_DOUBLE (0 << CS43L22_SPEED_SHIFT) /* Slave: Double-Speed Mode (DSM - 50 kHz -100 kHz Fs) Master: MCLK=512 SCLK=64*/
#define CS43L22_SPEED_SINGLE (1 << CS43L22_SPEED_SHIFT) /* Slave: Single-Speed Mode (SSM - 4 kHz -50 kHz Fs) Master: MCLK=256 SCLK=64*/
#define CS43L22_SPEED_HALF (2 << CS43L22_SPEED_SHIFT) /* Slave: Half-Speed Mode (HSM - 12.5kHz -25 kHz Fs) Master: MCLK=128 SCLK=64*/
#define CS43L22_SPEED_QUARTER (3 << CS43L22_SPEED_SHIFT) /* Slave: Quarter-Speed Mode (QSM - 4 kHz -12.5 kHz Fs)Master: MCLK=128 SCLK=64*/
#define CS43L22_32k_GROUP_ENABLE (1 << 4) /* Bit 4: Specifies whether or not the input/output sample rate is 8 kHz, 16 kHz or 32 kHz */
#define CS43L22_VIDEOCLK_ENABLE (1 << 3) /* Bit 3: Specifies whether or not the external MCLK frequency is 27 MHz */
#define CS43L22_MCLK_LRCK_RATIO_SHIFT (1) /* Bits 1-2: Internal MCLK/LRCK Ratio */
#define CS43L22_RATIO_128_64 (0 << CS43L22_MCLK_LRCK_RATIO_SHIFT) /* RATIO[1:0] Internal MCLK Cycles per LRCK=128, SCLK/LRCK=64 Ratio in Master Mode */
#define CS43L22_RATIO_125_62 (1 << CS43L22_MCLK_LRCK_RATIO_SHIFT) /* RATIO[1:0] Internal MCLK Cycles per LRCK=125, SCLK/LRCK=62 Ratio in Master Mode */
#define CS43L22_RATIO_132_66 (2 << CS43L22_MCLK_LRCK_RATIO_SHIFT) /* RATIO[1:0] Internal MCLK Cycles per LRCK=132, SCLK/LRCK=66 Ratio in Master Mode */
#define CS43L22_RATIO_136_68 (3 << CS43L22_MCLK_LRCK_RATIO_SHIFT) /* RATIO[1:0] Internal MCLK Cycles per LRCK=136, SCLK/LRCK=68 Ratio in Master Mode */
#define CS43L22_CLKDIV2_ENABLE (1 << 0) /* Bit 0: Divided by 2 */
/* 0x06 Interface Control 1 */
#define CS43L22_MODE_MASTER (1 << 7) /* Configures the serial port I/O clocking */
#define CS43L22_SCLK_POLARITY_INVERT (1 << 6) /* Configures the polarity of the SCLK signal */
#define CS43L22_DSP_MODE_ENABLE (1 << 4) /* Configures a data-packed interface format for the DAC */
#define CS43L22_DAC_IF_FORMAT_SHIFT (2) /* Bits 2-3: Configures the digital interface format for data on SDIN */
#define CS43L22_DAC_IF_LEFT_JUSTIFIED (0 << CS43L22_DAC_IF_FORMAT_SHIFT) /* DACDIF[1:0] Left Justified, up to 24-bit data */
#define CS43L22_DAC_IF_I2S (1 << CS43L22_DAC_IF_FORMAT_SHIFT) /* DACDIF[1:0] I2S, up to 24-bit data */
#define CS43L22_DAC_IF_RIGHT_JUSTIFIED (2 << CS43L22_DAC_IF_FORMAT_SHIFT) /* DACDIF[1:0] Right Justified */
#define CS43L22_DAC_IF_RESERVED (3 << CS43L22_DAC_IF_FORMAT_SHIFT) /* DACDIF[1:0] Reserved */
#define CS43L22_AUDIO_WORD_LENGHT_SHIFT (0) /* Bits 0-1: Configures the audio sample word length used for the data into SDIN */
#define CS43L22_AWL_DSP_32_RJ_24 (0 << CS43L22_AUDIO_WORD_LENGHT_SHIFT)/* AWL[1:0] DSP Mode: 32-bit data, Right Justified: 24-bit data */
#define CS43L22_AWL_DSP_24_RJ_20 (1 << CS43L22_AUDIO_WORD_LENGHT_SHIFT)/* AWL[1:0] DSP Mode: 24-bit data, Right Justified: 20-bit data */
#define CS43L22_AWL_DSP_20_RJ_18 (2 << CS43L22_AUDIO_WORD_LENGHT_SHIFT)/* AWL[1:0] DSP Mode: 20-bit data, Right Justified: 18-bit data */
#define CS43L22_AWL_DSP_16_RJ_16 (3 << CS43L22_AUDIO_WORD_LENGHT_SHIFT)/* AWL[1:0] DSP Mode: 16 bit data, Right Justified: 16-bit data */
/* 0x0E Miscellaneous Controls */
#define CS43L22_FREEZE (1 << 3) /* Configures a hold on all register settings */
#define CS43L22_DEEMPHASIS_ENABLE (1 << 2) /* Configures a 15μs/50μs digital de-emphasis filter response on the headphone/line and speaker outputs */
/* 0x1F Tone Control */
#define CS43L22_TREB_GAIN_SHIFT (4) /* Sets the gain of the treble shelving filter */
#define CS43L22_TREB_GAIN(a) ((a) << CS43L22_TREB_GAIN_SHIFT)
/* TREB[3:0] Gain Setting:*/
/* 0000 +12.0 dB */
/* ··· ··· */
/* 0111 +1.5 dB */
/* 1000 0 dB */
/* 1001 -1.5 dB */
/* 1111 -10.5 dB */
/* Step Size: 1.5 dB */
#define CS43L22_BASS_GAIN_SHIFT (0) /* Sets the gain of the bass shelving filter */
#define CS43L22_BASS_GAIN(a) ((a) << CS43L22_BASS_GAIN_SHIFT)
/* BASS[3:0] Gain Setting:*/
/* 0000 +12.0 dB */
/* ··· ··· */
/* 0111 +1.5 dB */
/* 1000 0 dB */
/* 1001 -1.5 dB */
/* 1111 -10.5 dB */
/* Step Size: 1.5 dB */
/* FLL Configuration *********************************************************/
/* Default FLL configuration */
#define CS43L22_DEFAULT_SAMPRATE 11025 /* Initial sample rate */
#define CS43L22_DEFAULT_NCHANNELS 1 /* Initial number of channels */
#define CS43L22_DEFAULT_BPSAMP 16 /* Initial bits per sample */
#define CS43L22_NFLLRATIO 5 /* Number of FLL_RATIO values */
#define CS43L22_MINOUTDIV 4 /* Minimum FLL_OUTDIV divider */
#define CS43L22_MAXOUTDIV 64 /* Maximum FLL_OUTDIV divider */
#define CS43L22_BCLK_MAXDIV 20 /* Maximum BCLK divider */
#define CS43L22_FRAMELEN8 14 /* Bits per frame for 8-bit data */
#define CS43L22_FRAMELEN16 32 /* Bits per frame for 16-bit data */
/* Commonly defined and redefined macros */
#ifndef MIN
# define MIN(a,b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef MAX
# define MAX(a,b) (((a) > (b)) ? (a) : (b))
#endif
/****************************************************************************
* Public Types
****************************************************************************/
struct cs43l22_dev_s
{
/* We are an audio lower half driver (We are also the upper "half" of
* the CS43L22 driver with respect to the board lower half driver).
*
* Terminology: Our "lower" half audio instances will be called dev for the
* publicly visible version and "priv" for the version that only this driver
* knows. From the point of view of this driver, it is the board lower
* "half" that is referred to as "lower".
*/
struct audio_lowerhalf_s dev; /* CS43L22 audio lower half (this device) */
/* Our specific driver data goes here */
const FAR struct cs43l22_lower_s *lower; /* Pointer to the board lower functions */
FAR struct i2c_master_s *i2c; /* I2C driver to use */
FAR struct i2s_dev_s *i2s; /* I2S driver to use */
struct dq_queue_s pendq; /* Queue of pending buffers to be sent */
struct dq_queue_s doneq; /* Queue of sent buffers to be returned */
mqd_t mq; /* Message queue for receiving messages */
char mqname[16]; /* Our message queue name */
pthread_t threadid; /* ID of our thread */
uint32_t bitrate; /* Actual programmed bit rate */
sem_t pendsem; /* Protect pendq */
#ifdef CS43L22_USE_FFLOCK_INT
struct work_s work; /* Interrupt work */
#endif
uint16_t samprate; /* Configured samprate (samples/sec) */
#ifndef CONFIG_AUDIO_EXCLUDE_VOLUME
#ifndef CONFIG_AUDIO_EXCLUDE_BALANCE
uint16_t balance; /* Current balance level (b16) */
#endif /* CONFIG_AUDIO_EXCLUDE_BALANCE */
uint8_t volume; /* Current volume level {0..63} */
#endif /* CONFIG_AUDIO_EXCLUDE_VOLUME */
uint8_t nchannels; /* Number of channels (1 or 2) */
uint8_t bpsamp; /* Bits per sample (8 or 16) */
volatile uint8_t inflight; /* Number of audio buffers in-flight */
#ifdef CS43L22_USE_FFLOCK_INT
volatile bool locked; /* FLL is locked */
#endif
bool running; /* True: Worker thread is running */
bool paused; /* True: Playing is paused */
bool mute; /* True: Output is muted */
#ifndef CONFIG_AUDIO_EXCLUDE_STOP
bool terminating; /* True: Stop requested */
#endif
bool reserved; /* True: Device is reserved */
volatile int result; /* The result of the last transfer */
};
/****************************************************************************
* Public Data
****************************************************************************/
#ifdef CONFIG_CS43L22_CLKDEBUG
extern const uint8_t g_sysclk_scaleb1[CS43L22_BCLK_MAXDIV+1];
extern const uint8_t g_fllratio[CS43L22_NFLLRATIO];
#endif
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
/****************************************************************************
* Name: cs43l22_readreg
*
* Description:
* Read the specified 8-bit register from the CS43L22 device.
*
****************************************************************************/
#if defined(CONFIG_CS43L22_REGDUMP) || defined(CONFIG_CS43L22_CLKDEBUG)
struct cs43l22_dev_s;
uint8_t cs43l22_readreg(FAR struct cs43l22_dev_s *priv, uint8_t regaddr);
#endif
#endif /* CONFIG_AUDIO */
#endif /* __DRIVERS_AUDIO_CS43L22_H */