ac101.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. /*
  2. * ESPRESSIF MIT License
  3. *
  4. * Copyright (c) 2018 <ESPRESSIF SYSTEMS (SHANGHAI) PTE LTD>
  5. *
  6. * Permission is hereby granted for use on all ESPRESSIF SYSTEMS products, in which case,
  7. * it is free of charge, to any person obtaining a copy of this software and associated
  8. * documentation files (the "Software"), to deal in the Software without restriction, including
  9. * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10. * and/or sell copies of the Software, and to permit persons to whom the Software is furnished
  11. * to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in all copies or
  14. * substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  18. * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  19. * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  20. * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  21. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  22. *
  23. */
  24. #include <string.h>
  25. #include <esp_log.h>
  26. #include <esp_types.h>
  27. #include <esp_system.h>
  28. #include <freertos/FreeRTOS.h>
  29. #include <freertos/task.h>
  30. #include <driver/i2c.h>
  31. #include <driver/i2s.h>
  32. #include "adac.h"
  33. #include "ac101.h"
  34. const static char TAG[] = "AC101";
  35. #define SPKOUT_EN ((1 << 9) | (1 << 11) | (1 << 7) | (1 << 5))
  36. #define EAROUT_EN ((1 << 11) | (1 << 12) | (1 << 13))
  37. #define BIN(a, b, c, d) 0b##a##b##c##d
  38. #define min(a, b) (((a) < (b)) ? (a) : (b))
  39. #define max(a, b) (((a) > (b)) ? (a) : (b))
  40. #define AC_ASSERT(a, format, b, ...) \
  41. if ((a) != 0) \
  42. { \
  43. ESP_LOGE(TAG, format, ##__VA_ARGS__); \
  44. return b; \
  45. }
  46. static bool init(int i2c_port_num, int i2s_num, i2s_config_t *config);
  47. static void deinit(void);
  48. static void speaker(bool active);
  49. static void headset(bool active);
  50. static void volume(unsigned left, unsigned right);
  51. static void power(adac_power_e mode);
  52. struct adac_s dac_a1s = {init, deinit, power, speaker, headset, volume};
  53. static esp_err_t i2c_write_reg(uint8_t reg, uint16_t val);
  54. static uint16_t i2c_read_reg(uint8_t reg);
  55. static void ac101_start(ac_module_t mode);
  56. static void ac101_stop(void);
  57. static void ac101_set_earph_volume(uint8_t volume);
  58. static void ac101_set_spk_volume(uint8_t volume);
  59. static int ac101_get_spk_volume(void);
  60. static int i2c_port;
  61. /****************************************************************************************
  62. * init
  63. */
  64. static bool init(int i2c_port_num, int i2s_num, i2s_config_t *i2s_config)
  65. {
  66. esp_err_t res = ESP_OK;
  67. i2c_port = i2c_port_num;
  68. // configure i2c
  69. i2c_config_t i2c_config = {
  70. .mode = I2C_MODE_MASTER,
  71. .sda_io_num = 33,
  72. .sda_pullup_en = GPIO_PULLUP_ENABLE,
  73. .scl_io_num = 32,
  74. .scl_pullup_en = GPIO_PULLUP_ENABLE,
  75. .master.clk_speed = 250000,
  76. };
  77. i2c_param_config(i2c_port, &i2c_config);
  78. i2c_driver_install(i2c_port, I2C_MODE_MASTER, false, false, false);
  79. res = i2c_read_reg(CHIP_AUDIO_RS);
  80. if (!res)
  81. {
  82. ESP_LOGW(TAG, "No AC101 detected");
  83. i2c_driver_delete(i2c_port);
  84. return 0;
  85. }
  86. ESP_LOGI(TAG, "AC101 DAC using I2C sda:%u, scl:%u", i2c_config.sda_io_num, i2c_config.scl_io_num);
  87. res = i2c_write_reg(CHIP_AUDIO_RS, 0x123);
  88. // huh?
  89. vTaskDelay(100 / portTICK_PERIOD_MS);
  90. // enable the PLL from BCLK source
  91. i2c_write_reg(PLL_CTRL1, BIN(0000, 0001, 0100, 1111)); // F=1,M=1,PLL,INT=31 (medium)
  92. i2c_write_reg(PLL_CTRL2, BIN(1000, 0110, 0000, 0000)); // PLL, F=96,N_i=1024-96,F=0,N_f=0*0.2;
  93. // i2c_write_reg(PLL_CTRL2, BIN(1000,0011,1100,0000));
  94. // clocking system
  95. i2c_write_reg(SYSCLK_CTRL, BIN(1010, 1010, 0000, 1000)); // PLLCLK, BCLK1, IS1CLK, PLL, SYSCLK
  96. i2c_write_reg(MOD_CLK_ENA, BIN(1000, 0000, 0000, 1100)); // IS21, ADC, DAC
  97. i2c_write_reg(MOD_RST_CTRL, BIN(1000, 0000, 0000, 1100)); // IS21, ADC, DAC
  98. i2c_write_reg(I2S_SR_CTRL, BIN(0111, 0000, 0000, 0000)); // 44.1kHz
  99. // analogue config
  100. i2c_write_reg(I2S1LCK_CTRL, BIN(1000, 1000, 0101, 0000)); // Slave, BCLK=I2S/8,LRCK=32,16bits,I2Smode, Stereo
  101. i2c_write_reg(I2S1_SDOUT_CTRL, BIN(1100, 0000, 0000, 0000)); // I2S1ADC (R&L)
  102. i2c_write_reg(I2S1_SDIN_CTRL, BIN(1100, 0000, 0000, 0000)); // IS21DAC (R&L)
  103. i2c_write_reg(I2S1_MXR_SRC, BIN(0010, 0010, 0000, 0000)); // ADCL, ADCR
  104. i2c_write_reg(ADC_SRCBST_CTRL, BIN(0100, 0100, 0100, 0000)); // disable all boost (default)
  105. #if ENABLE_ADC
  106. i2c_write_reg(ADC_SRC, BIN(0000, 0100, 0000, 1000)); // source=linein(R/L)
  107. i2c_write_reg(ADC_DIG_CTRL, BIN(1000, 0000, 0000, 0000)); // enable digital ADC
  108. i2c_write_reg(ADC_ANA_CTRL, BIN(1011, 1011, 0000, 0000)); // enable analogue R/L, 0dB
  109. #else
  110. i2c_write_reg(ADC_SRC, BIN(0000, 0000, 0000, 0000)); // source=none
  111. i2c_write_reg(ADC_DIG_CTRL, BIN(0000, 0000, 0000, 0000)); // disable digital ADC
  112. i2c_write_reg(ADC_ANA_CTRL, BIN(0011, 0011, 0000, 0000)); // disable analogue R/L, 0dB
  113. #endif
  114. //Path Configuration
  115. i2c_write_reg(DAC_MXR_SRC, BIN(1000, 1000, 0000, 0000)); // DAC from I2S
  116. i2c_write_reg(DAC_DIG_CTRL, BIN(1000, 0000, 0000, 0000)); // enable DAC
  117. i2c_write_reg(OMIXER_DACA_CTRL, BIN(1111, 0000, 0000, 0000)); // enable DAC/Analogue (see note on offset removal and PA)
  118. i2c_write_reg(OMIXER_DACA_CTRL, BIN(1111, 1111, 0000, 0000)); // this toggle is needed for headphone PA offset
  119. #if ENABLE_ADC
  120. i2c_write_reg(OMIXER_SR, BIN(0000, 0001, 0000, 0010)); // source=DAC(R/L) (are DACR and DACL really inverted in bitmap?)
  121. #else
  122. i2c_write_reg(OMIXER_SR, BIN(0000, 0101, 0000, 1010)); // source=DAC(R/L) and LINEIN(R/L)
  123. #endif
  124. // configure I2S pins & install driver
  125. i2s_pin_config_t i2s_pin_config = (i2s_pin_config_t){.bck_io_num = 27, .ws_io_num = 26, .data_out_num = 25, .data_in_num = -1};
  126. res |= i2s_driver_install(i2s_num, i2s_config, 0, NULL);
  127. res |= i2s_set_pin(i2s_num, &i2s_pin_config);
  128. // enable earphone & speaker
  129. i2c_write_reg(SPKOUT_CTRL, 0x0220);
  130. i2c_write_reg(HPOUT_CTRL, 0xf801);
  131. // set gain for speaker and earphone
  132. ac101_set_spk_volume(70);
  133. ac101_set_earph_volume(70);
  134. ESP_LOGI(TAG, "DAC using I2S bck:%d, ws:%d, do:%d", i2s_pin_config.bck_io_num, i2s_pin_config.ws_io_num, i2s_pin_config.data_out_num);
  135. return (res == ESP_OK);
  136. }
  137. /****************************************************************************************
  138. * init
  139. */
  140. static void deinit(void)
  141. {
  142. i2c_driver_delete(i2c_port);
  143. }
  144. /****************************************************************************************
  145. * change volume
  146. */
  147. static void volume(unsigned left, unsigned right)
  148. {
  149. ac101_set_earph_volume(left);
  150. // nothing at that point, volume is handled by backend
  151. }
  152. /****************************************************************************************
  153. * power
  154. */
  155. static void power(adac_power_e mode)
  156. {
  157. switch (mode)
  158. {
  159. case ADAC_STANDBY:
  160. case ADAC_OFF:
  161. ac101_stop();
  162. break;
  163. case ADAC_ON:
  164. ac101_start(AC_MODULE_DAC);
  165. break;
  166. default:
  167. ESP_LOGW(TAG, "unknown power command");
  168. break;
  169. }
  170. }
  171. /****************************************************************************************
  172. * speaker
  173. */
  174. static void speaker(bool active)
  175. {
  176. uint16_t value = i2c_read_reg(SPKOUT_CTRL);
  177. if (active)
  178. i2c_write_reg(SPKOUT_CTRL, value | SPKOUT_EN);
  179. else
  180. i2c_write_reg(SPKOUT_CTRL, value & ~SPKOUT_EN);
  181. }
  182. /****************************************************************************************
  183. * headset
  184. */
  185. static void headset(bool active)
  186. {
  187. // there might be aneed to toggle OMIXER_DACA_CTRL 11:8, not sure
  188. uint16_t value = i2c_read_reg(HPOUT_CTRL);
  189. if (active)
  190. i2c_write_reg(HPOUT_CTRL, value | EAROUT_EN);
  191. else
  192. i2c_write_reg(HPOUT_CTRL, value & ~EAROUT_EN);
  193. }
  194. /****************************************************************************************
  195. *
  196. */
  197. static esp_err_t i2c_write_reg(uint8_t reg, uint16_t val)
  198. {
  199. i2c_cmd_handle_t cmd = i2c_cmd_link_create();
  200. esp_err_t ret = 0;
  201. uint8_t send_buff[4];
  202. send_buff[0] = (AC101_ADDR << 1);
  203. send_buff[1] = reg;
  204. send_buff[2] = (val >> 8) & 0xff;
  205. send_buff[3] = val & 0xff;
  206. ret |= i2c_master_start(cmd);
  207. ret |= i2c_master_write(cmd, send_buff, 4, ACK_CHECK_EN);
  208. ret |= i2c_master_stop(cmd);
  209. ret |= i2c_master_cmd_begin(i2c_port, cmd, 1000 / portTICK_PERIOD_MS);
  210. i2c_cmd_link_delete(cmd);
  211. return ret;
  212. }
  213. /****************************************************************************************
  214. *
  215. */
  216. static uint16_t i2c_read_reg(uint8_t reg)
  217. {
  218. uint8_t data[2] = {0};
  219. i2c_cmd_handle_t cmd = i2c_cmd_link_create();
  220. i2c_master_start(cmd);
  221. i2c_master_write_byte(cmd, (AC101_ADDR << 1) | WRITE_BIT, ACK_CHECK_EN);
  222. i2c_master_write_byte(cmd, reg, ACK_CHECK_EN);
  223. i2c_master_start(cmd);
  224. i2c_master_write_byte(cmd, (AC101_ADDR << 1) | READ_BIT, ACK_CHECK_EN); //check or not
  225. i2c_master_read(cmd, data, 2, ACK_VAL);
  226. i2c_master_stop(cmd);
  227. i2c_master_cmd_begin(i2c_port, cmd, 1000 / portTICK_PERIOD_MS);
  228. i2c_cmd_link_delete(cmd);
  229. return (data[0] << 8) + data[1];
  230. ;
  231. }
  232. /****************************************************************************************
  233. *
  234. */
  235. void set_sample_rate(int rate)
  236. {
  237. if (rate == 8000)
  238. rate = SAMPLE_RATE_8000;
  239. else if (rate == 11025)
  240. rate = SAMPLE_RATE_11052;
  241. else if (rate == 12000)
  242. rate = SAMPLE_RATE_12000;
  243. else if (rate == 16000)
  244. rate = SAMPLE_RATE_16000;
  245. else if (rate == 22050)
  246. rate = SAMPLE_RATE_22050;
  247. else if (rate == 24000)
  248. rate = SAMPLE_RATE_24000;
  249. else if (rate == 32000)
  250. rate = SAMPLE_RATE_32000;
  251. else if (rate == 44100)
  252. rate = SAMPLE_RATE_44100;
  253. else if (rate == 48000)
  254. rate = SAMPLE_RATE_48000;
  255. else if (rate == 96000)
  256. rate = SAMPLE_RATE_96000;
  257. else if (rate == 192000)
  258. rate = SAMPLE_RATE_192000;
  259. else
  260. {
  261. ESP_LOGW(TAG, "Unknown sample rate %hu", rate);
  262. rate = SAMPLE_RATE_44100;
  263. }
  264. i2c_write_reg(I2S_SR_CTRL, rate);
  265. }
  266. /****************************************************************************************
  267. * Get normalized (0..100) speaker volume
  268. */
  269. static int ac101_get_spk_volume(void)
  270. {
  271. return ((i2c_read_reg(SPKOUT_CTRL) & 0x1f) * 100) / 0x1f;
  272. }
  273. /****************************************************************************************
  274. * Set normalized (0..100) volume
  275. */
  276. static void ac101_set_spk_volume(uint8_t volume)
  277. {
  278. uint16_t value = min(volume, 100);
  279. value = ((int)value * 0x1f) / 100;
  280. value |= i2c_read_reg(SPKOUT_CTRL) & ~0x1f;
  281. i2c_write_reg(SPKOUT_CTRL, value);
  282. }
  283. /****************************************************************************************
  284. * Get normalized (0..100) earphone volume
  285. */
  286. static int ac101_get_earph_volume(void)
  287. {
  288. return (((i2c_read_reg(HPOUT_CTRL) >> 4) & 0x3f) * 100) / 0x3f;
  289. }
  290. /****************************************************************************************
  291. * Set normalized (0..100) earphone volume
  292. */
  293. static void ac101_set_earph_volume(uint8_t volume)
  294. {
  295. uint16_t value = min(volume, 255);
  296. value = (((int)value * 0x3f) / 255) << 4;
  297. value |= i2c_read_reg(HPOUT_CTRL) & ~(0x3f << 4);
  298. i2c_write_reg(HPOUT_CTRL, value);
  299. }
  300. /****************************************************************************************
  301. *
  302. */
  303. static void ac101_set_output_mixer_gain(ac_output_mixer_gain_t gain, ac_output_mixer_source_t source)
  304. {
  305. uint16_t regval, temp, clrbit;
  306. regval = i2c_read_reg(OMIXER_BST1_CTRL);
  307. switch (source)
  308. {
  309. case SRC_MIC1:
  310. temp = (gain & 0x7) << 6;
  311. clrbit = ~(0x7 << 6);
  312. break;
  313. case SRC_MIC2:
  314. temp = (gain & 0x7) << 3;
  315. clrbit = ~(0x7 << 3);
  316. break;
  317. case SRC_LINEIN:
  318. temp = (gain & 0x7);
  319. clrbit = ~0x7;
  320. break;
  321. default:
  322. return;
  323. }
  324. regval &= clrbit;
  325. regval |= temp;
  326. i2c_write_reg(OMIXER_BST1_CTRL, regval);
  327. }
  328. /****************************************************************************************
  329. *
  330. */
  331. static void ac101_start(ac_module_t mode)
  332. {
  333. if (mode == AC_MODULE_LINE)
  334. {
  335. i2c_write_reg(0x51, 0x0408);
  336. i2c_write_reg(0x40, 0x8000);
  337. i2c_write_reg(0x50, 0x3bc0);
  338. }
  339. if (mode == AC_MODULE_ADC || mode == AC_MODULE_ADC_DAC || mode == AC_MODULE_LINE)
  340. {
  341. // I2S1_SDOUT_CTRL
  342. // i2c_write_reg(PLL_CTRL2, 0x8120);
  343. i2c_write_reg(0x04, 0x800c);
  344. i2c_write_reg(0x05, 0x800c);
  345. // res |= i2c_write_reg(0x06, 0x3000);
  346. }
  347. if (mode == AC_MODULE_DAC || mode == AC_MODULE_ADC_DAC || mode == AC_MODULE_LINE)
  348. {
  349. uint16_t value = i2c_read_reg(PLL_CTRL2);
  350. value |= 0x8000;
  351. i2c_write_reg(PLL_CTRL2, value);
  352. }
  353. }
  354. /****************************************************************************************
  355. *
  356. */
  357. static void ac101_stop(void)
  358. {
  359. uint16_t value = i2c_read_reg(PLL_CTRL2);
  360. value &= ~0x8000;
  361. i2c_write_reg(PLL_CTRL2, value);
  362. }
  363. /****************************************************************************************
  364. *
  365. */
  366. static void ac101_deinit(void)
  367. {
  368. i2c_write_reg(CHIP_AUDIO_RS, 0x123); //soft reset
  369. }
  370. /****************************************************************************************
  371. * Don't know when this one is supposed to be called
  372. */
  373. static void ac101_i2s_config_clock(ac_i2s_clock_t *cfg)
  374. {
  375. uint16_t regval = 0;
  376. regval = i2c_read_reg(I2S1LCK_CTRL);
  377. regval &= 0xe03f;
  378. regval |= (cfg->bclk_div << 9);
  379. regval |= (cfg->lclk_div << 6);
  380. i2c_write_reg(I2S1LCK_CTRL, regval);
  381. }