api_sdadc.h 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. #ifndef _API_SDADC_H
  2. #define _API_SDADC_H
  3. #define CHANNEL_L 0x00ff
  4. #define CHANNEL_R 0xff00
  5. #define ADC2DAC_EN 0x01 //ADC-->DAC
  6. #define ADC2SRC_EN 0x02 //ADC-->SRC
  7. #define ADC2IRQ_EN 0x03 //ADC-->IRQ(测试用)
  8. #define ADC2DIR_EN 0x04 //ADC-->DAC(测试用)
  9. #define ADC2SANC_EN 0x05 //ADC-->SANC
  10. #define ADC2ASR_EN 0x06 //ADC-->ASR
  11. #define ADC_ALIGN_EN 0x07 //ADC DMA ALIGN
  12. typedef void (*pcm_callback_t)(u8 *ptr, u32 samples, int ch_mode);
  13. typedef struct {
  14. u16 channel;
  15. u8 sample_rate;
  16. u32 anl_gain;
  17. u32 dig_gain;
  18. u8 bits_mode; //ADC BITS选择;0: 24bits, 1: 16bits, 0xff: 跟随DAC的BIT MODE
  19. u8 out_ctrl;
  20. u16 samples;
  21. pcm_callback_t callback;
  22. } sdadc_cfg_t;
  23. enum {
  24. SPR_48000,
  25. SPR_44100,
  26. SPR_38000,
  27. SPR_32000,
  28. SPR_24000,
  29. SPR_22050,
  30. SPR_16000,
  31. SPR_12000,
  32. SPR_11025,
  33. SPR_8000,
  34. SPR_6000,
  35. SPR_4000,
  36. SPR_96000,
  37. SPR_88200,
  38. SPR_76000,
  39. SPR_64000,
  40. SPR_384000,
  41. SPR_352800,
  42. SPR_192000,
  43. SPR_176400,
  44. };
  45. void set_mic_analog_gain(u16 level, u16 channel); //0~23(共24级), step 3DB (-6db ~ +63db)
  46. void sdadc_set_digital_gain(u16 ch, u16 gain);
  47. void sdadc_set_soft_gain(u16 ch, u32 gain);
  48. void set_aux_analog_vol(u8 level, u8 auxlr_sel);
  49. void set_aux_analog_gain(u32 gain, u16 channel);
  50. void sdadc_dummy(u8 *ptr, u32 samples, int ch_mode);
  51. void sdadc_pcm_2_dac(u8 *ptr, u32 samples, int ch_mode);
  52. void sdadc_pcm_2_dac1(u8 *ptr, u32 samples, int ch_mode);
  53. void sdadc_var_init(void);
  54. int sdadc_init(const sdadc_cfg_t *p_cfg);
  55. int sdadc_start(u16 channel);
  56. int sdadc_exit(u16 channel);
  57. u32 sdadc_channel_enable_meanwhile(u32 adc_ch, u16 anc_dma_ch); //控制多个DMA同时启动,必须在 sdadc_start 之后调用
  58. void sdadc_set_5ch_en(void);
  59. bool sdadc_drc_init(u8 *drc_addr, int drc_len);
  60. //mic
  61. void mic_mute(void);
  62. void mic_unmute(void);
  63. //anc
  64. typedef enum {
  65. MODE_TWS_FFFB, //TWS耳机mic2(FF/FB)输入,DACL输出
  66. MODE_FFFB, //非TWS mic2、3(FF/FB)输入,DACL/R输出(mic2->dacl,mic3->dacr)
  67. MODE_TWS_HYBRID = 8,//TWS耳机mic2、3(Hybrid)输入,DACL输出
  68. MODE_HYBRID, //非TWS mic0、1、2、3(Hybrid)输入,DACL/R输出(mic01->dacl,mic23->dacr)
  69. } ANC_MODE;
  70. //ANC算法
  71. enum ANC_ALG_TYPE {
  72. ANC_ALG_WIND_NOISE_FF = 0x01, //自研单MIC(FF)传统特征风噪和能量检测算法
  73. ANC_ALG_WIND_NOISE_FF_TALK, //自研双MIC(FF+TALK)传统特征风噪和能量检测算法
  74. ANC_ALG_WIND_NOISE_FF_FB, //自研双MIC(FF+FB)传统特征风噪和能量检测算法
  75. ANC_ALG_ASM_SIM_FF, //自研单MIC(FF)降增噪算法
  76. ANC_ALG_HOWLING_FB, //自研防啸叫(FB)ANC算法
  77. ANC_ALG_FIT_DETECT_FF_FB, //自研贴合度检测(FF+FB)ANC算法
  78. ANC_ALG_HOWLING_FF, //自研防啸叫(FF)ANC算法
  79. ANC_ALG_AI_WN_FF, //自研单MIC(FF)AI风噪检测算法
  80. ANC_ALG_LIMITER_FF, //自研单MIC(FF)瞬态噪声检测算法
  81. ANC_ALG_DYVOL_FF, //自研单MIC(FF)动态音量算法
  82. ANC_ALG_MSC_ADP_FB, //自研单MIC(FB)自适应音乐补偿算法
  83. ANC_ALG_ADP_EQ_FF_FB, //自研双MIC(FF+FB)自适应EQ算法
  84. ANC_ALG_ASM_FF, //自研单MIC(FF)环境自适应ANC算法
  85. ANC_ALG_AEM_RT_FF_FB, //自研双MIC(FF+FB)半入耳耳道自适应算法
  86. SNDP_SAE_SHIELD_LEAK = 0x80, //声加泄露补偿自适应ANC算法(SAE_EL01)
  87. SNDP_SAE_ADAPTER_ANC, //声加泄露补偿自适应ANC算法(SAE_EL01)
  88. SNDP_SAE_WIND_DETECT, //声加ANC风噪检测算法
  89. ANC_ALG_DUMP_TYPE = 0xFE,
  90. ANC_ALG_USER = 0xFF, //用户自定义ANC算法
  91. };
  92. #define ANC_ALG_DUMP_DATA_FF BIT(0)
  93. #define ANC_ALG_DUMP_DATA_FB BIT(1)
  94. #define ANC_ALG_DUMP_DATA_TALK BIT(2)
  95. #define ANC_ALG_DUMP_DATA_SPK BIT(3)
  96. #define ANC_ALG_DUMP_DATA_ANCOUT BIT(4)
  97. #define ANC_ALG_DUMP_DATA_FF_R BIT(5)
  98. #define ANC_ALG_DUMP_DATA_FB_R BIT(6)
  99. //ANC DS DMA数据
  100. enum {
  101. ANC_DS_DATA_ADC0_ANC_DOUT = 1,
  102. ANC_DS_DATA_ADC1_ANC_DOUT,
  103. ANC_DS_DATA_ADC2_ANC_DOUT,
  104. ANC_DS_DATA_ADC3_ANC_DOUT,
  105. ANC_DS_DATA_DACL_MUSIC,
  106. ANC_DS_DATA_DACR_MUSIC,
  107. ANC_DS_DATA_ANC0_FF_DOUT,
  108. ANC_DS_DATA_ANC0_FB_DOUT,
  109. ANC_DS_DATA_ANC1_FF_DOUT,
  110. ANC_DS_DATA_ANC1_FB_DOUT,
  111. ANC_DS_DATA_DACL_SPK,
  112. ANC_DS_DATA_DACR_SPK,
  113. };
  114. typedef struct {
  115. u8 drc_en :1;
  116. u8 drc_after_eq :1; //0:adc->drc->eq 1:adc->eq->drc
  117. u8 filter_en :1;
  118. u8 filter_band;
  119. u8 rfu[2];
  120. const u32 *filter_coef;
  121. const u32 *drc_coef;
  122. } anc_drc_t;
  123. typedef struct {
  124. u32 nos_gain;
  125. const u32 *nos_param;
  126. u32 msc_gain;
  127. const u32 *msc_param;
  128. anc_drc_t drc;
  129. u8 mic_ch;
  130. u8 nos_band; //ANC降噪eq条数
  131. u8 msc_band; //ANC音乐补偿eq条数
  132. u8 bypass :1; //ANC EQ Bypass,置1 EQ无效
  133. u8 msc_dly :2; //music sample delay
  134. u8 rmdc_sel :3; //rmdc level:0(5.269Hz),1(168.6Hz),2(42.15Hz),3(21.07Hz),4(10.53Hz),5(2.634Hz),6(1.317Hz),7(0.658Hz)
  135. } anc_channel_t;
  136. struct anc_cfg_t {
  137. ANC_MODE anc_mode;
  138. u8 spr;
  139. u8 rfu[2];
  140. anc_channel_t *ch[4];
  141. u8 fade_in_step; //淡入速度,step * 85ms(384k)
  142. u8 fade_out_step; //淡出速度,step * 85ms(384k)
  143. u16 change_en :1; //change是否使能
  144. u16 dc_rm :1;
  145. u16 fade_en :1; //淡入淡出使能
  146. u16 order :2;
  147. u16 output_swap :1; //DACLR互换输出
  148. };
  149. //ANC算法初始化参数
  150. typedef struct {
  151. u8 mic_cfg;
  152. u8 dump_en;
  153. u8 pcm_interleave;
  154. u8 alg_nch;
  155. u16 alg_samples;
  156. u16 start_delay;
  157. u8 type[4];
  158. void* alg_param[4];
  159. u32 resv[4];
  160. } anc_alg_param_cb;
  161. typedef struct {
  162. u16 channel; //bit[0:7] ANC0DMA, bit[7:15] ANC1DMA
  163. u16 dig_gain; //bit[0:7] ANC0DMA, bit[7:15] ANC1DMA
  164. u8 sample_rate;
  165. u8 bits_mode; //0: 24bits, 1: 16bits
  166. u16 samples;
  167. pcm_callback_t callback;
  168. u32 resv;
  169. } anc_dma_cfg_cb;
  170. #define ANC_FIX_BIT 23
  171. #define EQ_GAIN_MAX 0x07eca9cd //24dB
  172. #define EQ_GAIN_MIN 0x00081385 //-24dB
  173. void anc_var_init(void);
  174. void anc_init(void *cfg);
  175. void anc_start(void);
  176. void anc_stop(void);
  177. void anc_exit(void);
  178. bool anc_set_param(void);
  179. void anc_set_eq_param_change(u8 ch);
  180. u8 anc_set_param_is_busy(void); //ret: BIT(0):lch is busy; BIT(1):rch is busy
  181. void anc_set_tansparency_mode(u8 en); //使能/关闭通透模式,默认关闭,调用后需要更新参数才起作用
  182. bool anc_is_tansparency_mode(void); //当前是否处于通透模式
  183. void anc_mic_mute(u8 ch, u8 mute);
  184. void anc_dig_mic_mute(u8 ch, u8 mute);
  185. void anc_set_mic_gain(u8 ch, u8 anl, u8 gain);
  186. u32 anc_pow10_cal(int index); //10^(dB/20)*2^23, index = 10*dB, -12.0<dB<12.0
  187. void anc_set_drc_param(void);
  188. void anc_vol_set(u8 ch, u16 vol, u8 step, u8 direct_set, u8 fade_step); //vol:Q15, step:0~15
  189. //ANC DMA
  190. int anc_dma_start(anc_dma_cfg_cb* cfg, u8 kick_start);
  191. int anc_dma_exit(void);
  192. bool anc_dma_is_use(void);
  193. void ttp_init(u32 param);
  194. void ttp_exit(void);
  195. void sdadc_pdm_mic_init(u8 mapping);
  196. void sdadc_pdm_mic_exit(u8 mapping);
  197. void lefmic_zero_detect_do(u8 *ptr, u32 samples);
  198. bool sdadcl_set_soft_eq_by_res(u32 addr, u32 len);
  199. bool sdadcr_set_soft_eq_by_res(u32 addr, u32 len);
  200. #endif //_API_SDADC_H