Files
AC707N/SDK/interface/media/cpu/br35/asm/audio_adc.h
T
2025-12-03 11:12:34 +08:00

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