es8311.c 11 KB

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