123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388 |
- /****************************************************************************
- * 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 */
|