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