quec_codec_cfg.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /*================================================================
  2. Copyright (c) 2020 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
  3. Quectel Wireless Solution Proprietary and Confidential.
  4. =================================================================*/
  5. #include "ql_api_common.h"
  6. #include "ql_audio.h"
  7. #include "ql_codec_config.h"
  8. /*===========================================================================
  9. * Variables
  10. ===========================================================================*/
  11. /*
  12. ES8311寄存器组,用户可以对照ES8311手册在此修改寄存器
  13. g_es8311InitRegList: 初始化codec时会将此结构体中的配置发送给codec
  14. g_es8311PlayRegList: 开始播放时会将此结构体中的配置发送给codec
  15. g_es8311RecRegList: 开始录音时会将此结构体中的配置发送给codec
  16. g_es8311CloseRegList:关闭codec时会将此结构体中的配置发送给codec
  17. 播放时的调用流程: g_es8311InitRegList --> g_es8311PlayRegList --> g_es8311CloseRegList
  18. 录音时的调用流程: g_es8311InitRegList --> g_es8311RecRegList --> g_es8311CloseRegList
  19. */
  20. static ql_codec_reg_t g_es8311InitRegList[] = ES8311_INIT_CONFIG;
  21. static ql_codec_reg_t g_es8311PlayRegList[] = ES8311_PLAY_CONFIG;
  22. static ql_codec_reg_t g_es8311RecRegList[] = ES8311_RECORD_CONFIG;
  23. static ql_codec_reg_t g_es8311CloseRegList[] = ES8311_CLOSE_CONFIG;
  24. static ql_aud_adc_cfg ql_adc_cfg = {QL_ADC_GAIN_LEVEL_9};
  25. static ql_aud_dac_cfg ql_dac_cfg = {0xbf};
  26. /*===========================================================================
  27. * Functions
  28. ===========================================================================*/
  29. extern ql_audio_errcode_e ql_es8311_read_reg(uint8 RegAddr, uint8 *p_value);
  30. extern ql_audio_errcode_e ql_es8311_write_reg(uint8 RegAddr, uint8 RegData);
  31. extern void quec_es8311_write_list(ql_codec_reg_t *regList, uint16_t len);
  32. static void quec_es8311_config_dac(bool mute_dac)
  33. {
  34. if(mute_dac)
  35. {
  36. ql_es8311_write_reg(ES8311_REG_DAC, 0); //音量为0,将dac寄存器关闭做到彻底静音
  37. }
  38. else
  39. {
  40. ql_aud_set_dac_gain(&ql_dac_cfg);//音量不为0,根据ql_aud_get_adc_gain接口设置的增益来配置dac寄存器
  41. }
  42. }
  43. /*
  44. 用户如果在app侧自行控制codec,需要在此处定义一个函数名为quec_es8311_cfg_cb的空函数,避免内核找不到此函数
  45. 导致编译报错,内核在开机时也会调用ql_aud_ext_codec_cfg将quec_es8311_cfg_cb函数注册为codec回调,用户在app
  46. 侧重新注册其他回调函数后,内核之前注册的回调函数就会失效,用户即可在app侧仿照此处的逻辑去控制外置codec寄存器
  47. */
  48. int quec_es8311_cfg_cb(ql_codec_cb_param_t *param)
  49. {
  50. switch(param->stage)
  51. {
  52. case QL_EXT_CODEC_INIT:
  53. quec_es8311_write_list(g_es8311InitRegList, sizeof(g_es8311InitRegList) / sizeof(ql_codec_reg_t));
  54. break;
  55. case QL_EXT_CODEC_REC:
  56. quec_es8311_write_list(g_es8311RecRegList, sizeof(g_es8311RecRegList) / sizeof(ql_codec_reg_t));
  57. ql_aud_set_adc_gain(&ql_adc_cfg);//配置增益
  58. break;
  59. case QL_EXT_CODEC_PLAY:
  60. quec_es8311_write_list(g_es8311PlayRegList, sizeof(g_es8311PlayRegList) / sizeof(ql_codec_reg_t));
  61. case QL_EXT_CODEC_SET_VOLUME:
  62. quec_es8311_config_dac(AUDIOHAL_SPK_MUTE == ql_get_volume() ? true : false);
  63. break;
  64. case QL_EXT_CODEC_DEINIT:
  65. quec_es8311_write_list(g_es8311CloseRegList, sizeof(g_es8311CloseRegList) / sizeof(ql_codec_reg_t));
  66. break;
  67. default:
  68. break;
  69. }
  70. return 0;
  71. }
  72. /*
  73. 读取/配置ES8311的adc/dac增益
  74. */
  75. ql_audio_errcode_e ql_aud_set_adc_gain(ql_aud_adc_cfg * adc_cfg)
  76. {
  77. if((NULL == adc_cfg) || (adc_cfg->adc_gain < QL_ADC_GAIN_LEVEL_1) || (adc_cfg->adc_gain > QL_ADC_GAIN_LEVEL_12))
  78. {
  79. return QL_AUDIO_INVALID_PARAM;
  80. }
  81. if(QL_ADC_GAIN_LEVEL_1 == adc_cfg->adc_gain)
  82. {
  83. if(ql_es8311_write_reg(ES8311_REG_ADC, 0x00))// reg 0x17 set volume mute
  84. {
  85. return QL_AUDIO_CODEC_WR_FAIL;
  86. }
  87. }
  88. else
  89. {
  90. uint16_t REG14 = ((1 << 4) | adc_cfg->adc_gain);// 0-3 bit adc pga gain value
  91. if(ql_es8311_write_reg(ES8311_REG_SYSTEM,REG14))// 8311 change adc pga gain reg 0x14
  92. {
  93. return QL_AUDIO_CODEC_WR_FAIL;
  94. }
  95. if(ql_es8311_write_reg(ES8311_REG_ADC, 0xBF))
  96. {
  97. return QL_AUDIO_CODEC_WR_FAIL;
  98. }
  99. }
  100. ql_adc_cfg.adc_gain = adc_cfg->adc_gain;
  101. return QL_AUDIO_SUCCESS;
  102. }
  103. ql_audio_errcode_e ql_aud_get_adc_gain(ql_aud_adc_cfg * adc_cfg)
  104. {
  105. if(NULL == adc_cfg)
  106. {
  107. return QL_AUDIO_INVALID_PARAM;
  108. }
  109. adc_cfg->adc_gain = ql_adc_cfg.adc_gain;
  110. return QL_AUDIO_SUCCESS;
  111. }
  112. ql_audio_errcode_e ql_aud_set_dac_gain(ql_aud_dac_cfg * dac_cfg)
  113. {
  114. if(ql_es8311_write_reg(0x32,dac_cfg->dac_gain))// 8311 change dac volume reg 0x32
  115. {
  116. return QL_AUDIO_CODEC_WR_FAIL;
  117. }
  118. ql_dac_cfg.dac_gain = dac_cfg->dac_gain;
  119. return QL_AUDIO_SUCCESS;
  120. }
  121. ql_audio_errcode_e ql_aud_get_dac_gain(ql_aud_dac_cfg * dac_cfg)
  122. {
  123. if(dac_cfg == NULL)
  124. {
  125. return QL_AUDIO_INVALID_PARAM;
  126. }
  127. dac_cfg->dac_gain = ql_dac_cfg.dac_gain;
  128. return QL_AUDIO_SUCCESS;
  129. }