sdk-hwV1.3/lichee/xr806/appos/include/driver/chip/hal_snd_card.h

461 lines
12 KiB
C
Executable File

/**
* @file hal_snd_card.h
* @author XRADIO IOT WLAN Team
*/
/*
* Copyright (C) 2017 XRADIO TECHNOLOGY CO., LTD. All rights reserved.
*
* 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 of XRADIO TECHNOLOGY CO., LTD. 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 _HAL_SND_CARD_H_
#define _HAL_SND_CARD_H_
#include "driver/chip/hal_def.h"
#include "driver/chip/hal_gpio.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Codec name */
#define XRADIO_CODEC_NULL_NAME "xradio_codec_null"
#define XRADIO_INTERNAL_CODEC_NAME "xradio_internal_codec"
#define AC107_CODEC_NAME "ac107_codec"
#define AC101_CODEC_NAME "ac101_codec"
/* Platform name */
#define XRADIO_PLATFORM_I2S_NAME "xradio_platform_i2s"
/* Snd card suffix name */
#define SND_CARD_SUFFIX "_sound_card"
#define _HAL_SND_CARD_NAME(codec_name, snd_card_suffix) (codec_name snd_card_suffix)
#define HAL_SND_CARD_NAME(codec_name, snd_card_suffix) _HAL_SND_CARD_NAME(codec_name, snd_card_suffix)
/* Codec sysclk src */
typedef enum {
SYSCLK_SRC_OSC,
SYSCLK_SRC_MCLK,
SYSCLK_SRC_BCLK,
SYSCLK_SRC_PLL,
} Codec_Sysclk_Src;
/* Codec PLL src */
typedef enum {
PLLCLK_SRC_MCLK,
PLLCLK_SRC_BCLK,
PLLCLK_SRC_PDMCLK,
} Codec_Pllclk_Src;
/* Codec ioctl cmd */
typedef enum {
CODEC_IOCTL_PCM_READ,
CODEC_IOCTL_PCM_WRITE,
CODEC_IOCTL_HW_CONFIG,
CODEC_IOCTL_SW_CONFIG,
CODEC_IOCTL_CMD_MAX = CODEC_IOCTL_SW_CONFIG,
PLATFORM_IOCTL_HW_CONFIG,
PLATFORM_IOCTL_SW_CONFIG,
PLATFORM_IOCTL_CMD_MAX = PLATFORM_IOCTL_SW_CONFIG,
} Snd_Card_Ioctl_Cmd;
#define I2S_ROLE_MASK 0x000f
#define I2S_FORMAT_MASK 0x00f0
#define I2S_POLARITY_MASK 0x0f00
/* I2S Role */
typedef enum {
DAIFMT_CBM_CFM = 1 << 0, /*(codec BCLK & FRM master)*/
DAIFMT_CBS_CFM = 2 << 0, /*(codec BCLK slave & FRM master)*/
DAIFMT_CBM_CFS = 3 << 0, /*(codec BCLK master & FRM slave)*/
DAIFMT_CBS_CFS = 4 << 0, /*(codec BCLK & FRM slave)*/
} I2s_Role;
/* I2S Format */
typedef enum {
DAIFMT_I2S = 1 << 4, /*(standard i2s format)*/
DAIFMT_RIGHT_J = 2 << 4, /*(right justfied format)*/
DAIFMT_LEFT_J = 3 << 4, /*(left justfied format)*/
DAIFMT_DSP_A = 4 << 4, /*(pcm. MSB is available on 2nd BCLK rising edge after LRCK rising edge)*/
DAIFMT_DSP_B = 5 << 4, /*(pcm. MSB is available on 1st BCLK rising edge after LRCK rising edge*/
} I2s_Format;
/* I2S Polarity */
typedef enum {
DAIFMT_NB_NF = 1 << 8, /*(normal BCLK clock + FRM)*/
DAIFMT_NB_IF = 2 << 8, /*(normal BCLK + inv FRM)*/
DAIFMT_IB_NF = 3 << 8, /*(invert BCLK + nor FRM)*/
DAIFMT_IB_IF = 4 << 8, /*(invert BCLK + FRM)*/
} I2s_Polarity;
/* Audio Stream direction */
typedef enum {
PCM_OUT,
PCM_IN,
} Audio_Stream_Dir;
/* Audio Device state */
typedef enum {
AUDIO_DEV_DIS,
AUDIO_DEV_EN,
} Audio_Dev_State;
/* AUDIO Mute state */
typedef enum {
AUDIO_UNMUTE,
AUDIO_MUTE,
} Audio_Mute_State;
/* codec driver select */
typedef enum {
XRADIO_CODEC_NULL,
XRADIO_CODEC_INTERNAL,
XRADIO_CODEC_AC107,
XRADIO_CODEC_AC101,
} Codec_Attr;
/* platform driver select */
typedef enum {
XRADIO_PLATFORM_NULL,
XRADIO_PLATFORM_I2S,
XRADIO_PLATFORM_DMIC,
} Platform_Attr;
/* Sound Card number */
typedef enum {
SND_CARD_0,
SND_CARD_1,
SND_CARD_2,
SND_CARD_3,
SND_CARD_MAX = SND_CARD_3,
} Snd_Card_Num;
/* Volume set flag */
#define VOLUME_SET_LEVEL (0x0000)
#define VOLUME_SET_GAIN (0x8000)
#define VOLUME_SET_MASK (0x8000)
/* Volume Level */
typedef enum {
VOLUME_LEVEL0,
VOLUME_LEVEL1,
VOLUME_LEVEL2,
VOLUME_LEVEL3,
VOLUME_LEVEL4,
VOLUME_LEVEL5,
VOLUME_LEVEL6,
VOLUME_LEVEL7,
VOLUME_LEVEL8,
VOLUME_LEVEL9,
VOLUME_LEVEL10,
VOLUME_LEVEL11,
VOLUME_LEVEL12,
VOLUME_LEVEL13,
VOLUME_LEVEL14,
VOLUME_LEVEL15,
VOLUME_LEVEL16,
VOLUME_LEVEL17,
VOLUME_LEVEL18,
VOLUME_LEVEL19,
VOLUME_LEVEL20,
VOLUME_LEVEL21,
VOLUME_LEVEL22,
VOLUME_LEVEL23,
VOLUME_LEVEL24,
VOLUME_LEVEL25,
VOLUME_LEVEL26,
VOLUME_LEVEL27,
VOLUME_LEVEL28,
VOLUME_LEVEL29,
VOLUME_LEVEL30,
VOLUME_LEVEL31,
VOLUME_MAX_LEVEL = VOLUME_LEVEL31,
} Volume_Level;
/* Gain @dB */
typedef enum {
/* plus gain */
VOLUME_GAIN_0dB,
VOLUME_GAIN_1dB,
VOLUME_GAIN_2dB,
VOLUME_GAIN_3dB,
VOLUME_GAIN_4dB,
VOLUME_GAIN_5dB,
VOLUME_GAIN_6dB,
VOLUME_GAIN_7dB,
VOLUME_GAIN_8dB,
VOLUME_GAIN_9dB,
VOLUME_GAIN_10dB,
VOLUME_GAIN_11dB,
VOLUME_GAIN_12dB,
VOLUME_GAIN_13dB,
VOLUME_GAIN_14dB,
VOLUME_GAIN_15dB,
VOLUME_GAIN_16dB,
VOLUME_GAIN_17dB,
VOLUME_GAIN_18dB,
VOLUME_GAIN_19dB,
VOLUME_GAIN_20dB,
VOLUME_GAIN_21dB,
VOLUME_GAIN_22dB,
VOLUME_GAIN_23dB,
VOLUME_GAIN_24dB,
VOLUME_GAIN_25dB,
VOLUME_GAIN_26dB,
VOLUME_GAIN_27dB,
VOLUME_GAIN_28dB,
VOLUME_GAIN_29dB,
VOLUME_GAIN_30dB,
VOLUME_GAIN_31dB,
VOLUME_GAIN_32dB,
VOLUME_GAIN_33dB,
VOLUME_GAIN_34dB,
VOLUME_GAIN_35dB,
VOLUME_GAIN_36dB,
VOLUME_GAIN_37dB,
VOLUME_GAIN_38dB,
VOLUME_GAIN_39dB,
VOLUME_GAIN_40dB,
VOLUME_GAIN_41dB,
VOLUME_GAIN_42dB,
VOLUME_GAIN_43dB,
VOLUME_GAIN_44dB,
VOLUME_GAIN_45dB,
VOLUME_GAIN_46dB,
VOLUME_GAIN_47dB,
VOLUME_GAIN_48dB,
VOLUME_GAIN_49dB,
VOLUME_GAIN_50dB,
VOLUME_GAIN_51dB,
VOLUME_GAIN_52dB,
VOLUME_GAIN_53dB,
VOLUME_GAIN_54dB,
VOLUME_GAIN_55dB,
VOLUME_GAIN_56dB,
VOLUME_GAIN_57dB,
VOLUME_GAIN_58dB,
VOLUME_GAIN_59dB,
VOLUME_GAIN_60dB,
VOLUME_GAIN_61dB,
VOLUME_GAIN_62dB,
VOLUME_GAIN_63dB,
VOLUME_GAIN_64dB,
/* minus gain */
VOLUME_GAIN_MINUS_1dB,
VOLUME_GAIN_MINUS_2dB,
VOLUME_GAIN_MINUS_3dB,
VOLUME_GAIN_MINUS_4dB,
VOLUME_GAIN_MINUS_5dB,
VOLUME_GAIN_MINUS_6dB,
VOLUME_GAIN_MINUS_7dB,
VOLUME_GAIN_MINUS_8dB,
VOLUME_GAIN_MINUS_9dB,
VOLUME_GAIN_MINUS_10dB,
VOLUME_GAIN_MINUS_11dB,
VOLUME_GAIN_MINUS_12dB,
VOLUME_GAIN_MINUS_13dB,
VOLUME_GAIN_MINUS_14dB,
VOLUME_GAIN_MINUS_15dB,
VOLUME_GAIN_MINUS_16dB,
VOLUME_GAIN_MINUS_17dB,
VOLUME_GAIN_MINUS_18dB,
VOLUME_GAIN_MINUS_19dB,
VOLUME_GAIN_MINUS_20dB,
VOLUME_GAIN_MINUS_21dB,
VOLUME_GAIN_MINUS_22dB,
VOLUME_GAIN_MINUS_23dB,
VOLUME_GAIN_MINUS_24dB,
VOLUME_GAIN_MINUS_25dB,
VOLUME_GAIN_MINUS_26dB,
VOLUME_GAIN_MINUS_27dB,
VOLUME_GAIN_MINUS_28dB,
VOLUME_GAIN_MINUS_29dB,
VOLUME_GAIN_MINUS_30dB,
VOLUME_GAIN_MINUS_31dB,
VOLUME_GAIN_MINUS_32dB,
VOLUME_GAIN_MINUS_33dB,
VOLUME_GAIN_MINUS_34dB,
VOLUME_GAIN_MINUS_35dB,
VOLUME_GAIN_MINUS_36dB,
VOLUME_GAIN_MINUS_37dB,
VOLUME_GAIN_MINUS_38dB,
VOLUME_GAIN_MINUS_39dB,
VOLUME_GAIN_MINUS_40dB,
VOLUME_GAIN_MINUS_41dB,
VOLUME_GAIN_MINUS_42dB,
VOLUME_GAIN_MINUS_43dB,
VOLUME_GAIN_MINUS_44dB,
VOLUME_GAIN_MINUS_45dB,
VOLUME_GAIN_MINUS_46dB,
VOLUME_GAIN_MINUS_47dB,
VOLUME_GAIN_MINUS_48dB,
VOLUME_GAIN_MINUS_49dB,
VOLUME_GAIN_MINUS_50dB,
VOLUME_GAIN_MINUS_51dB,
VOLUME_GAIN_MINUS_52dB,
VOLUME_GAIN_MINUS_53dB,
VOLUME_GAIN_MINUS_54dB,
VOLUME_GAIN_MINUS_55dB,
VOLUME_GAIN_MINUS_56dB,
VOLUME_GAIN_MINUS_57dB,
VOLUME_GAIN_MINUS_58dB,
VOLUME_GAIN_MINUS_59dB,
VOLUME_GAIN_MINUS_60dB,
VOLUME_GAIN_MINUS_61dB,
VOLUME_GAIN_MINUS_62dB,
VOLUME_GAIN_MINUS_63dB,
VOLUME_GAIN_MINUS_64dB,
VOLUME_GAIN_MUTE = 0xff,
} Volume_Gain;
/* PCM Format */
enum pcm_format {
PCM_FORMAT_S8,
PCM_FORMAT_S12_LE,
PCM_FORMAT_S16_LE,
PCM_FORMAT_S20_LE,
PCM_FORMAT_S24_LE,
PCM_FORMAT_S28_LE,
PCM_FORMAT_S32_LE,
PCM_FORMAT_MAX = PCM_FORMAT_S32_LE,
};
/* pcm config*/
struct pcm_config {
uint32_t rate;
uint32_t channels;
uint32_t period_size;
uint32_t period_count;
enum pcm_format format;
};
/* PA Switch Control */
typedef struct {
uint16_t on_delay_before;
uint16_t on_delay_after;
GPIO_PinState on_state;
const GPIO_PinMuxParam *pin_param;
uint8_t pin_param_cnt;
} Pa_Switch_Ctl;
/* snd card board config */
struct snd_card_board_config {
Snd_Card_Num card_num;
const char *card_name;
Codec_Attr codec_link;
Platform_Attr platform_link;
const Pa_Switch_Ctl *pa_switch_ctl;
Codec_Sysclk_Src codec_sysclk_src;
Codec_Pllclk_Src codec_pllclk_src;
uint32_t codec_pll_freq_in;
uint32_t i2s_fmt;
};
/******************************* Audio device enum definition *********************************/
#define AUDIO_IN_DEV_SHIFT (0)
#define AUDIO_OUT_DEV_SHIFT (8)
typedef enum {
AUDIO_IN_DEV_AMIC = HAL_BIT(AUDIO_IN_DEV_SHIFT), /*< AMIC > */
AUDIO_IN_DEV_LINEIN = HAL_BIT(AUDIO_IN_DEV_SHIFT + 1), /*< LINEIN > */
AUDIO_IN_DEV_DMIC = HAL_BIT(AUDIO_IN_DEV_SHIFT + 2), /*< DMIC > */
AUDIO_IN_DEV_ALL = (0x07 << AUDIO_IN_DEV_SHIFT),
AUDIO_OUT_DEV_HP = HAL_BIT(AUDIO_OUT_DEV_SHIFT), /*< Headphone >*/
AUDIO_OUT_DEV_SPK = HAL_BIT(AUDIO_OUT_DEV_SHIFT + 1), /*< Speaker >*/
AUDIO_OUT_DEV_ALL = (0x03 << AUDIO_OUT_DEV_SHIFT),
} Audio_Device;
/********************************* pcm config interface ***************************************/
uint8_t pcm_format_to_bits(enum pcm_format format);
uint8_t pcm_format_to_sampleresolution(enum pcm_format format);
uint32_t pcm_config_to_frames(struct pcm_config *config);
uint32_t pcm_frames_to_bytes(struct pcm_config *config, unsigned int frames);
/********************************* HAL snd card interface *************************************/
uint8_t HAL_SndCard_Register(void);
HAL_Status HAL_SndCard_Unregister(void);
HAL_Status HAL_SndCard_CodecRegisterInternal(void);
HAL_Status HAL_SndCard_CodecUnregisterInternal(void);
HAL_Status HAL_SndCard_CodecRegisterAc107(void);
HAL_Status HAL_SndCard_CodecUnregisterAc107(void);
HAL_Status HAL_SndCard_CodecRegisterAc101(void);
HAL_Status HAL_SndCard_CodecUnregisterAc101(void);
HAL_Status HAL_SndCard_PlatformRegisterI2S(void);
HAL_Status HAL_SndCard_PlatformUnregisterI2S(void);
HAL_Status HAL_SndCard_Open(Snd_Card_Num card_num, Audio_Stream_Dir stream_dir, struct pcm_config *pcm_cfg);
HAL_Status HAL_SndCard_Close(Snd_Card_Num card_num, Audio_Stream_Dir stream_dir);
HAL_Status HAL_SndCard_SetVolume(Snd_Card_Num card_num, Audio_Device dev, uint16_t volume);
HAL_Status HAL_SndCard_SetRoute(Snd_Card_Num card_num, Audio_Device dev, Audio_Dev_State state);
HAL_Status HAL_SndCard_SetMute(Snd_Card_Num card_num, Audio_Device dev, Audio_Mute_State mute);
HAL_Status HAL_SndCard_Ioctl(Snd_Card_Num card_num, Snd_Card_Ioctl_Cmd cmd, uint32_t cmd_param[],
uint32_t cmd_param_len);
int HAL_SndCard_PcmRead(Snd_Card_Num card_num, uint8_t *buf, uint32_t size);
int HAL_SndCard_PcmWrite(Snd_Card_Num card_num, uint8_t *buf, uint32_t size);
int HAL_SndCard_CodecRegRead(Snd_Card_Num card_num, uint32_t reg);
int HAL_SndCard_CodecRegWrite(Snd_Card_Num card_num, uint32_t reg, uint32_t val);
uint8_t HAL_SndCard_GetCardNums(void);
void HAL_SndCard_GetAllCardNum(uint8_t card_num[]);
/**********************************************************************************************/
#ifdef __cplusplus
}
#endif
#endif