es8311.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. #include "luat_base.h"
  2. #include "luat_gpio.h"
  3. #include "luat_i2c.h"
  4. #include "luat_audio_air101.h"
  5. #include "luat_timer.h"
  6. #include "es8311.h"
  7. #define LUAT_LOG_TAG "es8311"
  8. #include "luat_log.h"
  9. static void es8311_write_reg(uint8_t addr, uint8_t data){
  10. uint8_t temp[] = {addr,data};
  11. luat_i2c_send(0, ES8311_ADDR, temp, 2 , 1);
  12. luat_timer_mdelay(1);
  13. }
  14. static uint8_t es8311_read_reg(uint8_t addr){
  15. uint8_t temp=0;
  16. luat_i2c_send(0, ES8311_ADDR, &addr, 1 , 0);
  17. luat_i2c_recv(0, ES8311_ADDR, &temp, 1);
  18. return temp;
  19. }
  20. static int es8311_codec_standby(void){
  21. es8311_write_reg(ES8311_DAC_REG32, 0x00);
  22. es8311_write_reg(ES8311_ADC_REG17, 0x00);
  23. es8311_write_reg(ES8311_SYSTEM_REG0E, 0xFF);
  24. es8311_write_reg(ES8311_SYSTEM_REG12, 0x02);
  25. es8311_write_reg(ES8311_SYSTEM_REG14, 0x00);
  26. es8311_write_reg(ES8311_SYSTEM_REG0D, 0xFA);
  27. es8311_write_reg(ES8311_RESET_REG00, 0x00);
  28. es8311_write_reg(ES8311_RESET_REG00, 0x1F);
  29. es8311_write_reg(ES8311_CLK_MANAGER_REG01, 0x30);
  30. es8311_write_reg(ES8311_CLK_MANAGER_REG01, 0x00);
  31. es8311_write_reg(ES8311_GP_REG45, 0x01);
  32. es8311_write_reg(ES8311_SYSTEM_REG0D, 0xFC);
  33. return 0;
  34. }
  35. static uint8_t es8311_codec_vol(uint8_t vol){
  36. if(vol < 0 || vol > 100){
  37. return -1;
  38. }
  39. int gain = vol == 0 ? -955 : (vol - 80) * 5;
  40. uint8_t reg_val = (uint8_t)((gain + 955) / 5);
  41. es8311_write_reg(ES8311_DAC_REG32, reg_val);
  42. return vol;
  43. }
  44. /*0---master, 1---slave*/
  45. static void es8311_codec_mode(uint8_t mode){
  46. if (mode == 0){
  47. es8311_write_reg(ES8311_RESET_REG00, 0xC0);
  48. }else{
  49. es8311_write_reg(ES8311_RESET_REG00, 0x80);
  50. }
  51. }
  52. static int es8311_codec_samplerate(uint16_t samplerate){
  53. if(samplerate != 8000 && samplerate != 16000 && samplerate != 32000 &&
  54. samplerate != 11025 && samplerate != 22050 && samplerate != 44100 &&
  55. samplerate != 12000 && samplerate != 24000 && samplerate != 48000)
  56. {
  57. LLOGE("samplerate error!\n");
  58. return -1;
  59. }
  60. // uint8_t i = 0;
  61. static int mclk = 0;
  62. static int switchflag = 0;
  63. switch(samplerate){
  64. case 8000:
  65. if (mclk == 0){
  66. mclk = 1;
  67. }
  68. es8311_write_reg(ES8311_CLK_MANAGER_REG02, 0x08);
  69. es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x44);
  70. if (switchflag == 0){
  71. switchflag = 1;
  72. es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x19);
  73. es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x19);
  74. }
  75. break;
  76. case 16000:
  77. if (mclk == 0){
  78. mclk = 1;
  79. }
  80. es8311_write_reg(ES8311_CLK_MANAGER_REG02, 0x90);
  81. es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x00);
  82. if (switchflag == 0){
  83. switchflag = 1;
  84. es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x19);
  85. es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x19);
  86. }
  87. break;
  88. case 32000:
  89. if (mclk == 0){
  90. mclk = 1;
  91. }
  92. es8311_write_reg(ES8311_CLK_MANAGER_REG02, 0x18);
  93. es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x44);
  94. if (switchflag == 0){
  95. switchflag = 1;
  96. es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x19);
  97. es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x19);
  98. }
  99. break;
  100. case 44100:
  101. mclk = 0;
  102. switchflag = 0;
  103. es8311_write_reg(ES8311_CLK_MANAGER_REG02, (0x03 << 3));
  104. es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x00);
  105. es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x10);
  106. es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x10);
  107. break;
  108. case 22050:
  109. mclk = 0;
  110. switchflag = 0;
  111. es8311_write_reg(ES8311_CLK_MANAGER_REG02, (0x02 << 3));
  112. es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x00);
  113. es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x10);
  114. es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x10);
  115. break;
  116. case 11025:
  117. mclk = 0;
  118. switchflag = 0;
  119. es8311_write_reg(ES8311_CLK_MANAGER_REG02, (0x01 << 3));
  120. es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x00);
  121. es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x10);
  122. es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x10);
  123. break;
  124. case 48000:
  125. mclk = 0;
  126. switchflag = 0;
  127. es8311_write_reg(ES8311_CLK_MANAGER_REG02, (0x03 << 3));
  128. es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x00);
  129. es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x10);
  130. es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x10);
  131. break;
  132. case 24000:
  133. mclk = 0;
  134. switchflag = 0;
  135. es8311_write_reg(ES8311_CLK_MANAGER_REG02, (0x02 << 3));
  136. es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x00);
  137. es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x10);
  138. es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x10);
  139. break;
  140. case 12000:
  141. mclk = 0;
  142. switchflag = 0;
  143. es8311_write_reg(ES8311_CLK_MANAGER_REG02, (0x01 << 3));
  144. es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x00);
  145. es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x10);
  146. es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x10);
  147. break;
  148. default:
  149. break;
  150. }
  151. return 0;
  152. }
  153. static int es8311_update_bits(uint8_t reg, uint8_t mask, uint8_t val){
  154. uint8_t old, new;
  155. old = es8311_read_reg(reg);
  156. new = (old & ~mask) | (val & mask);
  157. es8311_write_reg(reg, new);
  158. return 0;
  159. }
  160. static int es8311_codec_samplebits(uint8_t samplebits){
  161. if(samplebits != 8 && samplebits != 16 && samplebits != 24 && samplebits != 32){
  162. LLOGE("bit_width error!\n");
  163. return -1;
  164. }
  165. int wl;
  166. switch (samplebits)
  167. {
  168. case 16:
  169. wl = 3;
  170. break;
  171. case 18:
  172. wl = 2;
  173. break;
  174. case 20:
  175. wl = 1;
  176. break;
  177. case 24:
  178. wl = 0;
  179. break;
  180. case 32:
  181. wl = 4;
  182. break;
  183. default:
  184. return -1;
  185. }
  186. es8311_update_bits(ES8311_SDPIN_REG09,
  187. ES8311_SDPIN_REG09_DACWL_MASK,
  188. wl << ES8311_SDPIN_REG09_DACWL_SHIFT);
  189. es8311_update_bits(ES8311_SDPOUT_REG0A,
  190. ES8311_SDPOUT_REG0A_ADCWL_MASK,
  191. wl << ES8311_SDPOUT_REG0A_ADCWL_SHIFT);
  192. return 0;
  193. }
  194. static int es8311_codec_channels(uint8_t channels){
  195. return 0;
  196. }
  197. static int es8311_reg_init(void){
  198. /* reset codec */
  199. es8311_write_reg(ES8311_RESET_REG00, 0x1F);
  200. es8311_write_reg(ES8311_GP_REG45, 0x00);
  201. luat_timer_mdelay(10);
  202. // es8311_write_reg(ES8311_GPIO_REG44, 0x08);
  203. // luat_timer_mdelay(1);
  204. // es8311_write_reg(ES8311_GPIO_REG44, 0x08);
  205. /* set ADC/DAC CLK */
  206. /* MCLK from BCLK */
  207. es8311_write_reg(ES8311_CLK_MANAGER_REG01, 0x30);
  208. es8311_write_reg(ES8311_CLK_MANAGER_REG02, 0x90);
  209. es8311_write_reg(ES8311_CLK_MANAGER_REG03, 0x19);
  210. es8311_write_reg(ES8311_ADC_REG16, 0x02);// bit5:0~non standard audio clock
  211. es8311_write_reg(ES8311_CLK_MANAGER_REG04, 0x19);
  212. es8311_write_reg(ES8311_CLK_MANAGER_REG05, 0x00);
  213. /*new cfg*/
  214. es8311_write_reg(ES8311_CLK_MANAGER_REG06, BCLK_DIV);
  215. es8311_write_reg(ES8311_CLK_MANAGER_REG07, 0x01);
  216. es8311_write_reg(ES8311_CLK_MANAGER_REG08, 0xff);
  217. /* set system power up */
  218. es8311_write_reg(ES8311_SYSTEM_REG0B, 0x00);
  219. es8311_write_reg(ES8311_SYSTEM_REG0C, 0x00);
  220. es8311_write_reg(ES8311_SYSTEM_REG10, 0x1F);
  221. es8311_write_reg(ES8311_SYSTEM_REG11, 0x7F);
  222. /* chip powerup. slave mode */
  223. es8311_write_reg(ES8311_RESET_REG00, 0x80);
  224. luat_timer_mdelay(50);
  225. /* power up analog */
  226. es8311_write_reg(ES8311_SYSTEM_REG0D, 0x01);
  227. /* power up digital */
  228. es8311_write_reg(ES8311_CLK_MANAGER_REG01, 0x3F);
  229. // SET ADC
  230. es8311_write_reg(ES8311_SYSTEM_REG14, DADC_GAIN);
  231. // SET DAC
  232. es8311_write_reg(ES8311_SYSTEM_REG12, 0x00);
  233. // ENABLE HP DRIVE
  234. es8311_write_reg(ES8311_SYSTEM_REG13, 0x10);
  235. // SET ADC/DAC DATA FORMAT
  236. es8311_write_reg(ES8311_SDPIN_REG09, 0x0c);
  237. es8311_write_reg(ES8311_SDPOUT_REG0A, 0x0c);
  238. /* set normal power mode */
  239. es8311_write_reg(ES8311_SYSTEM_REG0E, 0x02);
  240. es8311_write_reg(ES8311_SYSTEM_REG0F, 0x44);
  241. // SET ADC
  242. /* set adc softramp */
  243. es8311_write_reg(ES8311_ADC_REG15, 0x00);
  244. /* set adc hpf */
  245. es8311_write_reg(ES8311_ADC_REG1B, 0x05);
  246. /* set adc hpf,ADC_EQ bypass */
  247. es8311_write_reg(ES8311_ADC_REG1C, 0x65);
  248. /* set adc digtal vol */
  249. es8311_write_reg(ES8311_ADC_REG17, ADC_VOLUME_GAIN);
  250. /* set dac softramp,disable DAC_EQ */
  251. es8311_write_reg(ES8311_DAC_REG37, 0x08);
  252. es8311_write_reg(ES8311_DAC_REG32, 0xBF);
  253. // /* set adc gain scale up */
  254. // es8311_write_reg(ES8311_ADC_REG16, 0x24);
  255. // /* set adc alc maxgain */
  256. // es8311_write_reg(ES8311_ADC_REG17, 0xBF);
  257. // /* adc alc disable,alc_winsize */
  258. // es8311_write_reg(ES8311_ADC_REG18, 0x07);
  259. // /* set alc target level */
  260. // es8311_write_reg(ES8311_ADC_REG19, 0xFB);
  261. // /* set adc_automute noise gate */
  262. // es8311_write_reg(ES8311_ADC_REG1A, 0x03);
  263. // /* set adc_automute vol */
  264. // es8311_write_reg(ES8311_ADC_REG1B, 0xEA);
  265. return 0;
  266. }
  267. static int es8311_codec_init(audio_codec_conf_t* conf){
  268. uint8_t temp1 = 0, temp2 = 0, temp3 = 0;
  269. if (conf->pa_pin != -1){
  270. luat_gpio_mode(conf->pa_pin, Luat_GPIO_OUTPUT, Luat_GPIO_DEFAULT, !conf->pa_on_level);
  271. luat_gpio_set(conf->pa_pin, !conf->pa_on_level);
  272. }
  273. luat_i2c_setup(0, I2C_REQ);
  274. temp1 = es8311_read_reg(ES8311_CHD1_REGFD);
  275. temp2 = es8311_read_reg(ES8311_CHD2_REGFE);
  276. temp3 = es8311_read_reg(ES8311_CHVER_REGFF);
  277. if(temp1 != 0x83 || temp2 != 0x11){
  278. LLOGE("codec err, id = 0x%x 0x%x ver = 0x%x", temp1, temp2, temp3);
  279. return -1;
  280. }
  281. es8311_reg_init();
  282. return 0;
  283. }
  284. static int es8311_codec_deinit(audio_codec_conf_t* conf){
  285. return 0;
  286. }
  287. static void es8311_codec_pa(audio_codec_conf_t* conf,uint8_t on){
  288. if (on){
  289. luat_timer_mdelay(conf->dummy_time_len);
  290. luat_gpio_set(conf->pa_pin, conf->pa_on_level);
  291. luat_timer_mdelay(conf->pa_delay_time);
  292. }else{
  293. luat_gpio_set(conf->pa_pin, !conf->pa_on_level);
  294. }
  295. }
  296. static int es8311_codec_control(audio_codec_conf_t* conf,uint8_t cmd,int data){
  297. switch (cmd)
  298. {
  299. case CODEC_CTL_MODE:
  300. es8311_codec_mode((uint8_t)data);
  301. break;
  302. case CODEC_CTL_VOLUME:
  303. es8311_codec_vol((uint8_t)data);
  304. break;
  305. case CODEC_CTL_RATE:
  306. es8311_codec_samplerate((uint16_t)data);
  307. break;
  308. case CODEC_CTL_BITS:
  309. es8311_codec_samplebits((uint8_t)data);
  310. break;
  311. case CODEC_CTL_CHANNEL:
  312. es8311_codec_channels((uint8_t)data);
  313. break;
  314. case CODEC_CTL_PA:
  315. es8311_codec_pa(conf,(uint8_t)data);
  316. break;
  317. default:
  318. break;
  319. }
  320. return 0;
  321. }
  322. static int es8311_codec_start(audio_codec_conf_t* conf){
  323. return 0;
  324. }
  325. static int es8311_codec_stop(audio_codec_conf_t* conf){
  326. return 0;
  327. }
  328. const audio_codec_opts_t codec_opts_es8311 = {
  329. .name = "es8311",
  330. .init = es8311_codec_init,
  331. .deinit = es8311_codec_deinit,
  332. .control = es8311_codec_control,
  333. .start = es8311_codec_start,
  334. .stop = es8311_codec_stop,
  335. };