414 lines
15 KiB
C
414 lines
15 KiB
C
#ifndef AUDIO_ADC_H
|
|
#define AUDIO_ADC_H
|
|
|
|
#include "generic/typedef.h"
|
|
#include "generic/list.h"
|
|
#include "generic/atomic.h"
|
|
#include "system/spinlock.h"
|
|
#include "audio_def.h"
|
|
|
|
/*无电容电路*/
|
|
#define SUPPORT_MIC_CAPLESS 1
|
|
|
|
#define LADC_STATE_INIT 1
|
|
#define LADC_STATE_OPEN 2
|
|
#define LADC_STATE_START 3
|
|
#define LADC_STATE_STOP 4
|
|
|
|
#define FPGA_BOARD 0
|
|
|
|
#define LADC_MIC 0
|
|
#define LADC_LINEIN 1
|
|
|
|
/* ADC 最大通道数 */
|
|
#define AUDIO_ADC_MAX_NUM (1)
|
|
#define AUDIO_ADC_MIC_MAX_NUM (1)
|
|
#define AUDIO_ADC_LINEIN_MAX_NUM (1)
|
|
|
|
/* 通道选择 */
|
|
#define AUDIO_ADC_MIC(x) BIT(x)
|
|
#define AUDIO_ADC_MIC_0 BIT(0)
|
|
#define AUDIO_ADC_MIC_1 BIT(1)
|
|
#define AUDIO_ADC_MIC_2 BIT(2)
|
|
#define AUDIO_ADC_MIC_3 BIT(3)
|
|
#define AUDIO_ADC_LINE(x) BIT(x)
|
|
#define AUDIO_ADC_LINE0 BIT(0)
|
|
#define AUDIO_ADC_LINE1 BIT(1)
|
|
#define AUDIO_ADC_LINE2 BIT(2)
|
|
#define AUDIO_ADC_LINE3 BIT(3)
|
|
#define PLNK_MIC BIT(6)
|
|
#define ALNK_MIC BIT(7)
|
|
|
|
|
|
/*******************************应用层**********************************/
|
|
/* 通道选择 */
|
|
#define AUDIO_ADC_MIC_CH AUDIO_ADC_MIC_0
|
|
|
|
/********************************************************************************
|
|
mic_mode 工作模式配置
|
|
********************************************************************************/
|
|
// TCFG_AUDIO_MICx_MODE
|
|
#define AUDIO_MIC_CAP_MODE 0 //单端隔直电容模式
|
|
#define AUDIO_MIC_CAP_DIFF_MODE 1 //差分隔直电容模式
|
|
#define AUDIO_MIC_CAPLESS_MODE 2 //单端省电容模式
|
|
|
|
/********************************************************************************
|
|
MICx 输入IO配置(要注意IO与mic bias 供电IO配置互斥)
|
|
********************************************************************************/
|
|
// TCFG_AUDIO_MIC0_AIN_SEL
|
|
#define AUDIO_MIC0_CH0 ADC_AIN_PORT0 // PA4
|
|
#define AUDIO_MIC0_CH1 ADC_AIN_PORT1 // PA3
|
|
#define AUDIO_MIC0_CH2 ADC_AIN_PORT2 // PA2
|
|
#define AUDIO_MIC0_CH3 ADC_AIN_PORT3
|
|
#define AUDIO_MIC0_CH4 ADC_AIN_PORT4
|
|
|
|
// TCFG_AUDIO_MIC1_AIN_SEL
|
|
#define AUDIO_MIC1_CH0 ADC_AIN_PORT0
|
|
#define AUDIO_MIC1_CH1 ADC_AIN_PORT1
|
|
#define AUDIO_MIC1_CH2 ADC_AIN_PORT2
|
|
|
|
// TCFG_AUDIO_MIC2_AIN_SEL
|
|
#define AUDIO_MIC2_CH0 ADC_AIN_PORT0
|
|
#define AUDIO_MIC2_CH1 ADC_AIN_PORT1
|
|
|
|
// TCFG_AUDIO_MIC3_AIN_SEL
|
|
#define AUDIO_MIC3_CH0 ADC_AIN_PORT0
|
|
#define AUDIO_MIC3_CH1 ADC_AIN_PORT1
|
|
|
|
/********************************************************************************
|
|
MICx mic bias 供电IO配置(要注意IO与micin IO配置互斥)
|
|
********************************************************************************/
|
|
// TCFG_AUDIO_MICx_BIAS_SEL
|
|
#define AUDIO_MIC_BIAS_NULL (0) // no bias
|
|
#define AUDIO_MIC_BIAS_CH0 BIT(0) // PA4 br29只使用PA0
|
|
#define AUDIO_MIC_BIAS_CH1 BIT(1)
|
|
#define AUDIO_MIC_BIAS_CH2 BIT(2)
|
|
#define AUDIO_MIC_BIAS_CH3 BIT(3)
|
|
#define AUDIO_MIC_LDO_PWR BIT(4)
|
|
|
|
/********************************************************************************
|
|
LINEINx 输入IO配置
|
|
********************************************************************************/
|
|
// TCFG_AUDIO_LINEIN0_AIN_SEL
|
|
#define AUDIO_LINEIN0_CH0 ADC_AIN_PORT0
|
|
#define AUDIO_LINEIN0_CH1 ADC_AIN_PORT1
|
|
#define AUDIO_LINEIN0_CH2 ADC_AIN_PORT2
|
|
#define AUDIO_LINEIN0_CH3 ADC_AIN_PORT3
|
|
#define AUDIO_LINEIN0_CH4 ADC_AIN_PORT4
|
|
|
|
// TCFG_AUDIO_LINEIN1_AIN_SEL
|
|
#define AUDIO_LINEIN1_CH0 ADC_AIN_PORT0
|
|
#define AUDIO_LINEIN1_CH1 ADC_AIN_PORT1
|
|
#define AUDIO_LINEIN1_CH2 ADC_AIN_PORT2
|
|
|
|
// TCFG_AUDIO_LINEIN2_AIN_SEL
|
|
#define AUDIO_LINEIN2_CH0 ADC_AIN_PORT0
|
|
#define AUDIO_LINEIN2_CH1 ADC_AIN_PORT1
|
|
|
|
// TCFG_AUDIO_LINEIN3_AIN_SEL
|
|
#define AUDIO_LINEIN3_CH0 ADC_AIN_PORT0
|
|
#define AUDIO_LINEIN3_CH1 ADC_AIN_PORT1
|
|
|
|
struct mic_capless_trim_result {
|
|
u8 bias_rsel;
|
|
};
|
|
struct mic_capless_trim_param {
|
|
u16 trigger_threshold;
|
|
u16 open_delay_ms; //adc上电等待稳定延时
|
|
u16 trim_delay_ms; //偏置调整等待稳定延时
|
|
};
|
|
|
|
struct audio_adc_output_hdl {
|
|
struct list_head entry;
|
|
void *priv;
|
|
void (*handler)(void *, s16 *, int);
|
|
};
|
|
|
|
struct audio_adc_private_param {
|
|
u8 mic_ldo_vsel; // default value=3
|
|
u8 performance_mode; // 性能模式 0:高性能 1:低功耗
|
|
};
|
|
|
|
struct mic_open_param {
|
|
u8 mic_ain_sel; // 0/1/2
|
|
u8 mic_bias_sel; // A
|
|
u8 mic_bias_rsel; // 单端隔直电容mic bias rsel
|
|
u8 mic_mode : 4; // MIC工作模式
|
|
u8 mic_dcc : 4; // DCC level
|
|
};
|
|
|
|
struct linein_open_param {
|
|
u8 linein_ain_sel; // 0/1/2
|
|
u8 linein_mode : 4; // LINEIN 工作模式
|
|
u8 linein_dcc : 4; // DCC level
|
|
};
|
|
|
|
struct audio_adc_hdl {
|
|
struct list_head head;
|
|
struct audio_adc_private_param *private;
|
|
spinlock_t lock;
|
|
#if SUPPORT_MIC_CAPLESS
|
|
struct mic_capless_trim_result capless_trim;
|
|
struct mic_capless_trim_param capless_param;
|
|
#endif
|
|
u8 adc_sel[AUDIO_ADC_MAX_NUM];
|
|
u8 adc_dcc[AUDIO_ADC_MAX_NUM];
|
|
struct mic_open_param mic_param[AUDIO_ADC_MAX_NUM];
|
|
struct linein_open_param linein_param[AUDIO_ADC_MAX_NUM];
|
|
u8 mic_ldo_state;
|
|
u8 state;
|
|
u8 channel;
|
|
u8 channel_num;
|
|
u8 mic_num;
|
|
u8 linein_num;
|
|
s16 *hw_buf; //ADC 硬件buffer的地址
|
|
u8 max_adc_num; //默认打开的ADC通道数
|
|
u8 buf_fixed; //是否固定adc硬件使用的buffer地址
|
|
u8 bit_width;
|
|
};
|
|
|
|
struct adc_mic_ch {
|
|
struct audio_adc_hdl *adc;
|
|
u8 gain[AUDIO_ADC_MIC_MAX_NUM];
|
|
u8 buf_num;
|
|
u16 buf_size;
|
|
s16 *bufs;
|
|
u16 sample_rate;
|
|
void (*handler)(struct adc_mic_ch *, s16 *, u16);
|
|
u8 ch_map;
|
|
};
|
|
|
|
struct adc_linein_ch {
|
|
struct audio_adc_hdl *adc;
|
|
u8 gain[AUDIO_ADC_LINEIN_MAX_NUM];
|
|
u8 buf_num;
|
|
u16 buf_size;
|
|
s16 *bufs;
|
|
u16 sample_rate;
|
|
void (*handler)(struct adc_linein_ch *, s16 *, u16);
|
|
};
|
|
|
|
/*
|
|
*********************************************************************
|
|
* Audio ADC Initialize
|
|
* Description: 初始化Audio_ADC模块的相关数据结构
|
|
* Arguments : adc ADC模块操作句柄
|
|
* pd ADC模块硬件相关配置参数
|
|
* Note(s) : None.
|
|
*********************************************************************
|
|
*/
|
|
void audio_adc_init(struct audio_adc_hdl *adc, struct audio_adc_private_param *private);
|
|
|
|
/*
|
|
*********************************************************************
|
|
* Audio ADC Output Callback
|
|
* Description: 注册adc采样输出回调函数
|
|
* Arguments : adc adc模块操作句柄
|
|
* output 采样输出回调
|
|
* Return : None.
|
|
* Note(s) : None.
|
|
*********************************************************************
|
|
*/
|
|
void audio_adc_add_output_handler(struct audio_adc_hdl *adc, struct audio_adc_output_hdl *output);
|
|
|
|
/*
|
|
*********************************************************************
|
|
* Audio ADC Output Callback
|
|
* Description: 删除adc采样输出回调函数
|
|
* Arguments : adc adc模块操作句柄
|
|
* output 采样输出回调
|
|
* Return : None.
|
|
* Note(s) : 采样通道关闭的时候,对应的回调也要同步删除,防止内存释
|
|
* 放出现非法访问情况
|
|
*********************************************************************
|
|
*/
|
|
void audio_adc_del_output_handler(struct audio_adc_hdl *adc, struct audio_adc_output_hdl *output);
|
|
|
|
/*
|
|
*********************************************************************
|
|
* Audio ADC IRQ Handler
|
|
* Description: Audio ADC中断回调函数
|
|
* Arguments : adc adc模块操作句柄
|
|
* Return : None.
|
|
* Note(s) : 仅供Audio_ADC中断使用
|
|
*********************************************************************
|
|
*/
|
|
void audio_adc_irq_handler(struct audio_adc_hdl *adc);
|
|
|
|
/*
|
|
*********************************************************************
|
|
* Audio ADC Mic Open
|
|
* Description: 打开mic采样通道
|
|
* Arguments : mic mic操作句柄
|
|
* ch_map mic通道索引
|
|
* adc adc模块操作句柄
|
|
* Return : 0 成功 其他 失败
|
|
* Note(s) : None.
|
|
*********************************************************************
|
|
*/
|
|
|
|
int audio_adc_mic_open(struct adc_mic_ch *mic, u32 ch_map, struct audio_adc_hdl *adc, struct mic_open_param *param);
|
|
|
|
/*
|
|
*********************************************************************
|
|
* Audio ADC Mic Gain
|
|
* Description: 设置mic增益
|
|
* Arguments : mic mic操作句柄
|
|
* gain mic增益
|
|
* Return : 0 成功 其他 失败
|
|
* Note(s) : MIC增益范围:0(-8dB)~19(30dB),step:2dB,level(4)=0dB
|
|
*********************************************************************
|
|
*/
|
|
int audio_adc_mic_set_gain(struct adc_mic_ch *mic, u32 ch_map, int gain);
|
|
|
|
/*
|
|
*********************************************************************
|
|
* Audio ADC Mic Pre_Gain
|
|
* Description: 设置mic第一级/前级增益
|
|
* Arguments : en 前级增益使能(0:6dB 1:0dB)
|
|
* Return : None.
|
|
* Note(s) : 前级增益只有0dB和6dB两个档位
|
|
*********************************************************************
|
|
*/
|
|
void audio_adc_mic_0dB_en(u32 ch_map, bool en);
|
|
|
|
/*
|
|
*********************************************************************
|
|
* Audio ADC Mic Gain Boost
|
|
* Description: 设置mic第一级/前级增益
|
|
* Arguments : ch_map AUDIO_ADC_MIC_0/AUDIO_ADC_MIC_1/AUDIO_ADC_MIC_2/AUDIO_ADC_MIC_3,多个通道可以或上同时设置
|
|
* level 前级增益档位(AUD_MIC_GB_0dB/AUD_MIC_GB_6dB)
|
|
* Return : None.
|
|
* Note(s) : None.
|
|
*********************************************************************
|
|
*/
|
|
#define AUD_MIC_GB_0dB (0)
|
|
#define AUD_MIC_GB_6dB (1)
|
|
void audio_adc_mic_gain_boost(u32 ch_map, u8 level);
|
|
|
|
/*
|
|
*********************************************************************
|
|
* Audio ADC linein Open
|
|
* Description: 打开linein采样通道
|
|
* Arguments : linein linein操作句柄
|
|
* ch_map linein通道索引
|
|
* adc adc模块操作句柄
|
|
* Return : 0 成功 其他 失败
|
|
* Note(s) : None.
|
|
*********************************************************************
|
|
*/
|
|
int audio_adc_linein_open(struct adc_linein_ch *linein, u32 ch_map, struct audio_adc_hdl *adc, struct linein_open_param *param);
|
|
|
|
/*
|
|
*********************************************************************
|
|
* Audio ADC linein Gain
|
|
* Description: 设置linein增益
|
|
* Arguments : linein linein操作句柄
|
|
* gain linein增益
|
|
* Return : 0 成功 其他 失败
|
|
* Note(s) : linein增益范围:0(-8dB)~19(30dB),step:2dB,level(4)=0dB
|
|
*********************************************************************
|
|
*/
|
|
int audio_adc_linein_set_gain(struct adc_linein_ch *linein, u32 ch_map, int gain);
|
|
|
|
/*
|
|
*********************************************************************
|
|
* Audio ADC Linein Gain Boost
|
|
* Description: 设置linein第一级/前级增益
|
|
* Arguments : ch_map AUDIO_ADC_LINE0/AUDIO_ADC_LINE1/AUDIO_ADC_LINE2/AUDIO_ADC_LINE3,多个通道可以或上同时设置
|
|
* level 前级增益档位(AUD_LINEIN_GB_0dB/AUD_LINEIN_GB_6dB)
|
|
* Return : None.
|
|
* Note(s) : None.
|
|
*********************************************************************
|
|
*/
|
|
#define AUD_LINEIN_GB_0dB (0)
|
|
#define AUD_LINEIN_GB_6dB (1)
|
|
void audio_adc_linein_gain_boost(u32 ch_map, u8 level);
|
|
|
|
/*
|
|
*********************************************************************
|
|
* Audio ADC linein Pre_Gain
|
|
* Description: 设置linein第一级/前级增益
|
|
* Arguments : en 前级增益使能(0:6dB 1:0dB)
|
|
* Return : None.
|
|
* Note(s) : 前级增益只有0dB和6dB两个档位
|
|
*********************************************************************
|
|
*/
|
|
void audio_adc_linein_0dB_en(u32 ch_map, bool en);
|
|
|
|
/*
|
|
*********************************************************************
|
|
* AUDIO MIC_LDO Control
|
|
* Description: mic电源mic_ldo控制接口
|
|
* Arguments : index ldo索引(MIC_LDO/MIC_LDO_BIAS0/MIC_LDO_BIAS1)
|
|
* en 使能控制
|
|
* pd audio_adc模块配置
|
|
* Return : 0 成功 其他 失败
|
|
* Note(s) : (1)MIC_LDO输出不经过上拉电阻分压
|
|
* MIC_LDO_BIAS输出经过上拉电阻分压
|
|
* (2)打开一个mic_ldo示例:
|
|
* audio_adc_mic_ldo_en(MIC_LDO,1);
|
|
* (2)打开多个mic_ldo示例:
|
|
* audio_adc_mic_ldo_en(MIC_LDO | MIC_LDO_BIAS,1);
|
|
*********************************************************************
|
|
*/
|
|
/*MIC LDO index输出定义*/
|
|
#define MIC_LDO BIT(0) //PA0输出原始MIC_LDO
|
|
#define MIC_LDO_BIAS0 BIT(1) //Pxx输出经过内部上拉电阻分压的偏置
|
|
#define MIC_LDO_BIAS1 BIT(2) //Pxx输出经过内部上拉电阻分压的偏置
|
|
#define MIC_LDO_BIAS2 BIT(3) //Pxx输出经过内部上拉电阻分压的偏置
|
|
#define MIC_LDO_BIAS3 BIT(4) //Pxx输出经过内部上拉电阻分压的偏置
|
|
int audio_adc_mic_ldo_en(u8 index, u8 en, u8 mic_bias_rsel);
|
|
|
|
int audio_adc_mic_set_sample_rate(struct adc_mic_ch *mic, int sample_rate);
|
|
|
|
int audio_adc_mic_set_buffs(struct adc_mic_ch *mic, s16 *bufs, u16 buf_size, u8 buf_num);
|
|
|
|
int audio_adc_mic_start(struct adc_mic_ch *mic);
|
|
|
|
int audio_adc_mic_close(struct adc_mic_ch *mic);
|
|
|
|
int audio_adc_linein_set_sample_rate(struct adc_linein_ch *linein, int sample_rate);
|
|
int audio_adc_linein_set_buffs(struct adc_linein_ch *linein, s16 *bufs, u16 buf_size, u8 buf_num);
|
|
|
|
int audio_adc_linein_start(struct adc_linein_ch *linein);
|
|
|
|
int audio_adc_linein_close(struct adc_linein_ch *linein);
|
|
|
|
int audio_adc_mic_type(u8 mic_idx);
|
|
|
|
u8 audio_adc_is_active(void);
|
|
|
|
void audio_adc_add_ch(struct audio_adc_hdl *adc, u8 amic_seq);
|
|
|
|
int get_adc_seq(struct audio_adc_hdl *adc, u16 ch_map);
|
|
|
|
int audio_adc_set_buf_fix(u8 fix_en, struct audio_adc_hdl *adc);
|
|
/*
|
|
*********************************************************************
|
|
* Audio ADC Mic PGA Mute
|
|
* Description: 打开ADC的PGA Mute时,相当与设置了PGA增益为-40dB
|
|
* Arguments : ch_map mic的通道
|
|
* mute mute的控制位
|
|
* Return : None.
|
|
* Note(s) : None.
|
|
*********************************************************************
|
|
*/
|
|
void audio_adc_mic_set_pga_mute(u32 ch_map, bool mute);
|
|
|
|
/*
|
|
*********************************************************************
|
|
* Audio ADC Linein PGA Mute
|
|
* Description: 打开ADC的PGA Mute时,相当与设置了PGA增益为-40dB
|
|
* Arguments : ch_map linein的通道
|
|
* mute mute的控制位
|
|
* Return : None.
|
|
* Note(s) : None.
|
|
*********************************************************************
|
|
*/
|
|
void audio_adc_linein_set_pga_mute(u32 ch_map, bool mute);
|
|
|
|
int audio_mic_bias_adjust(struct mic_capless_trim_result *capless_trim, struct mic_capless_trim_param *capless_param);
|
|
#endif/*AUDIO_ADC_H*/
|
|
|