1 /*
2 * SPDX-FileCopyrightText: 2019-2025 SiFli Technologies(Nanjing) Co., Ltd
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 /* Includes ------------------------------------------------------------------*/
8 #include "bf0_hal.h"
9
10 #if defined(HAL_AUDCODEC_MODULE_ENABLED)||defined(_SIFLI_DOXYGEN_)
11 //#define DBG_LEVEL DBG_LOG
12 //#define LOG_TAG "hal.audcodec"
13 //#include "drv_log.h"
14
15
16 static void HAL_AUDCODEC_DMA_Init(DMA_HandleTypeDef *hdma, uint8_t from_mem);
17
18 static void AUDCODEC_DMATxCplt(DMA_HandleTypeDef *hdma);
19 static void AUDCODEC_DMATxHalfCplt(DMA_HandleTypeDef *hdma);
20 static void AUDCODEC_DMARxCplt(DMA_HandleTypeDef *hdma);
21 static void AUDCODEC_DMAHalfRxCplt(DMA_HandleTypeDef *hdma);
22 static void AUDCODEC_DMAError(DMA_HandleTypeDef *hdma);
23
24 uint8_t g_pll_state = 0;
25 uint8_t g_pll_freq_type = 0;
26 static uint16_t pll_cfg2_reset = 0;
27
set_pll_state(uint8_t state)28 void set_pll_state(uint8_t state)
29 {
30 g_pll_state = state;
31 }
get_pll_state()32 uint8_t get_pll_state()
33 {
34 return g_pll_state;
35 }
set_pll_freq_type(uint8_t type)36 void set_pll_freq_type(uint8_t type)
37 {
38 g_pll_freq_type = type;
39 }
get_pll_freq_type()40 uint8_t get_pll_freq_type()
41 {
42 return g_pll_freq_type;
43 }
44 // need updata drv_audcodec if modify this function
updata_pll_freq(uint8_t type)45 __weak int updata_pll_freq(uint8_t type) //type 0: 16k 1024 series 1:44.1k 1024 series 2:16k 1000 series 3: 44.1k 1000 series
46 {
47 hwp_audcodec->PLL_CFG2 |= AUDCODEC_PLL_CFG2_RSTB;
48 // wait 50us
49 HAL_Delay_us(50);
50 if (0 == type)// set pll to 49.152M [(fcw+3)+sdin/2^20]*6M
51 {
52 hwp_audcodec->PLL_CFG3 = (201327 << AUDCODEC_PLL_CFG3_SDIN_Pos) |
53 (5 << AUDCODEC_PLL_CFG3_FCW_Pos) |
54 (0 << AUDCODEC_PLL_CFG3_SDM_UPDATE_Pos) |
55 (1 << AUDCODEC_PLL_CFG3_SDMIN_BYPASS_Pos) |
56 (0 << AUDCODEC_PLL_CFG3_SDM_MODE_Pos) |
57 (0 << AUDCODEC_PLL_CFG3_EN_SDM_DITHER_Pos) |
58 (0 << AUDCODEC_PLL_CFG3_SDM_DITHER_Pos) |
59 (1 << AUDCODEC_PLL_CFG3_EN_SDM_Pos) |
60 (0 << AUDCODEC_PLL_CFG3_SDMCLK_POL_Pos);
61 }
62 else if (1 == type)// set pll to 45.1584M
63 {
64
65 hwp_audcodec->PLL_CFG3 = (551970 << AUDCODEC_PLL_CFG3_SDIN_Pos) |
66 (4 << AUDCODEC_PLL_CFG3_FCW_Pos) |
67 (0 << AUDCODEC_PLL_CFG3_SDM_UPDATE_Pos) |
68 (1 << AUDCODEC_PLL_CFG3_SDMIN_BYPASS_Pos) |
69 (0 << AUDCODEC_PLL_CFG3_SDM_MODE_Pos) |
70 (0 << AUDCODEC_PLL_CFG3_EN_SDM_DITHER_Pos) |
71 (0 << AUDCODEC_PLL_CFG3_SDM_DITHER_Pos) |
72 (1 << AUDCODEC_PLL_CFG3_EN_SDM_Pos) |
73 (0 << AUDCODEC_PLL_CFG3_SDMCLK_POL_Pos);
74 }
75 else if (3 == type)// set pll to 44.1M
76 {
77
78 hwp_audcodec->PLL_CFG3 = (0x5999A << AUDCODEC_PLL_CFG3_SDIN_Pos) |
79 (4 << AUDCODEC_PLL_CFG3_FCW_Pos) |
80 (0 << AUDCODEC_PLL_CFG3_SDM_UPDATE_Pos) |
81 (1 << AUDCODEC_PLL_CFG3_SDMIN_BYPASS_Pos) |
82 (0 << AUDCODEC_PLL_CFG3_SDM_MODE_Pos) |
83 (0 << AUDCODEC_PLL_CFG3_EN_SDM_DITHER_Pos) |
84 (0 << AUDCODEC_PLL_CFG3_SDM_DITHER_Pos) |
85 (1 << AUDCODEC_PLL_CFG3_EN_SDM_Pos) |
86 (0 << AUDCODEC_PLL_CFG3_SDMCLK_POL_Pos);
87 }
88 else
89 {
90 //RT_ASSERT(0);
91 }
92 hwp_audcodec->PLL_CFG3 |= AUDCODEC_PLL_CFG3_SDM_UPDATE;
93 hwp_audcodec->PLL_CFG3 &= ~AUDCODEC_PLL_CFG3_SDMIN_BYPASS;
94 hwp_audcodec->PLL_CFG2 &= ~AUDCODEC_PLL_CFG2_RSTB;
95 // wait 50us
96 HAL_Delay_us(50);
97 hwp_audcodec->PLL_CFG2 |= AUDCODEC_PLL_CFG2_RSTB;
98 // check pll lock
99 //wait(2500);
100 HAL_Delay_us(50);
101
102 hwp_audcodec->PLL_CFG1 |= AUDCODEC_PLL_CFG1_CSD_EN | AUDCODEC_PLL_CFG1_CSD_RST;
103 HAL_Delay_us(50);
104 hwp_audcodec->PLL_CFG1 &= ~AUDCODEC_PLL_CFG1_CSD_RST;
105 if (hwp_audcodec->PLL_STAT & AUDCODEC_PLL_STAT_UNLOCK_Msk)
106 {
107 //rt_kprintf("pll lock fail! freq_type:%d\n", type);
108 return -1;
109 }
110 else
111 {
112 //rt_kprintf("pll lock! freq_type:%d\n", type);
113 hwp_audcodec->PLL_CFG1 &= ~AUDCODEC_PLL_CFG1_CSD_EN;
114 set_pll_freq_type(type);
115 }
116 return 0;
117 }
118
119 /**
120 * @brief enable PLL function
121 * @param freq - frequency
122 * @param type - 0:1024 series, 1:1000 series
123 * @return
124 */
bf0_enable_pll(uint32_t freq,uint8_t type)125 __weak int bf0_enable_pll(uint32_t freq, uint8_t type)// need updata drv_audcodec if modify this function
126 {
127 uint8_t freq_type;
128 uint8_t test_result = -1;
129 uint32_t pll_cnt;
130 uint32_t xtal_cnt;
131 uint32_t fc_vco;
132 uint32_t fc_vco_min;
133 uint32_t fc_vco_max;
134 uint32_t delta_cnt=0;
135 uint32_t delta_cnt_min=0;
136 uint32_t delta_cnt_max=0;
137 uint32_t delta_fc_vco;
138 uint32_t target_cnt = 1838;
139
140 fc_vco = 16;
141 delta_fc_vco = 8;
142 test_result = 0;
143
144 freq_type = type << 1;
145 if ((freq == 44100) || (freq == 22050) || (freq == 11025))
146 {
147 freq_type += 1;
148 }
149
150 //rt_kprintf("PLL_ENABLE pll_state:%d, freq_type:%d\n", get_pll_state(), freq_type);
151
152 if (0 == get_pll_state())
153 {
154 hwp_pmuc->HXT_CR1 |= PMUC_HXT_CR1_BUF_AUD_EN;
155 hwp_hpsys_rcc->ENR2 |= HPSYS_RCC_ENR2_AUDCODEC;
156 //hwp_lpsys_rcc->ENR1 |= LPSYS_RCC_ENR1_AUDCODEC;
157
158 //-----------------step 2------------------//
159 // turn on bandgap
160 // turn on BG sample clock
161 //hwp_audcodec->BG_CFG1 = 48000;
162 //hwp_audcodec->BG_CFG2 = 48000000;
163 // turn on bandgap
164 hwp_audcodec->BG_CFG0 &= ~AUDCODEC_BG_CFG0_EN_RCFLT;
165 hwp_audcodec->BG_CFG0 |= AUDCODEC_BG_CFG0_EN;
166 HAL_Delay_us(100);
167 #if 1
168 hwp_audcodec->BG_CFG0 &= ~AUDCODEC_BG_CFG0_EN_SMPL; //noise pop
169 #else
170 hwp_audcodec->BG_CFG0 |= AUDCODEC_BG_CFG0_EN_SMPL; //noise pop
171 #endif
172
173 //-----------------step 3------------------//
174 // pll calibration
175 // wait 100us
176 //wait(5000);
177 HAL_Delay_us(100);
178
179 hwp_audcodec->PLL_CFG0 |= AUDCODEC_PLL_CFG0_EN_IARY;
180 hwp_audcodec->PLL_CFG0 |= AUDCODEC_PLL_CFG0_EN_VCO;
181 hwp_audcodec->PLL_CFG0 |= AUDCODEC_PLL_CFG0_EN_ANA;
182 hwp_audcodec->PLL_CFG0 &= ~AUDCODEC_PLL_CFG0_ICP_SEL_Msk;
183 hwp_audcodec->PLL_CFG0 |= (8 << AUDCODEC_PLL_CFG0_ICP_SEL_Pos);
184 hwp_audcodec->PLL_CFG2 |= AUDCODEC_PLL_CFG2_EN_DIG;
185 hwp_audcodec->PLL_CFG3 |= AUDCODEC_PLL_CFG3_EN_SDM;
186 hwp_audcodec->PLL_CFG4 |= AUDCODEC_PLL_CFG4_EN_CLK_DIG;
187 hwp_audcodec->PLL_CFG1 = (3 << AUDCODEC_PLL_CFG1_R3_SEL_Pos) |
188 (1 << AUDCODEC_PLL_CFG1_RZ_SEL_Pos) |
189 (3 << AUDCODEC_PLL_CFG1_C2_SEL_Pos) |
190 (6 << AUDCODEC_PLL_CFG1_CZ_SEL_Pos) |
191 (0 << AUDCODEC_PLL_CFG1_CSD_RST_Pos) |
192 (0 << AUDCODEC_PLL_CFG1_CSD_EN_Pos);
193 // wait 50us
194 //wait(2500);
195 HAL_Delay_us(50);
196 // VCO freq calibration
197 hwp_audcodec->PLL_CFG0 |= AUDCODEC_PLL_CFG0_OPEN;
198 hwp_audcodec->PLL_CFG2 |= AUDCODEC_PLL_CFG2_EN_LF_VCIN;
199 hwp_audcodec->PLL_CAL_CFG = (0 << AUDCODEC_PLL_CAL_CFG_EN_Pos) |
200 (2000 << AUDCODEC_PLL_CAL_CFG_LEN_Pos);
201 // setup calibration and run
202 // target pll_cnt = ceil(46MHz/48MHz*2000)+1 = 1918
203 // target difference between pll_cnt and xtal_cnt should be less than 1
204 while (delta_fc_vco != 0)
205 {
206 hwp_audcodec->PLL_CFG0 &= ~AUDCODEC_PLL_CFG0_FC_VCO;
207 hwp_audcodec->PLL_CFG0 |= (fc_vco << AUDCODEC_PLL_CFG0_FC_VCO_Pos);
208 hwp_audcodec->PLL_CAL_CFG |= AUDCODEC_PLL_CAL_CFG_EN;
209 while (!(hwp_audcodec->PLL_CAL_CFG & AUDCODEC_PLL_CAL_CFG_DONE_Msk));
210 pll_cnt = (hwp_audcodec->PLL_CAL_RESULT >> AUDCODEC_PLL_CAL_RESULT_PLL_CNT_Pos);
211 xtal_cnt = (hwp_audcodec->PLL_CAL_RESULT & AUDCODEC_PLL_CAL_RESULT_XTAL_CNT_Msk);
212 hwp_audcodec->PLL_CAL_CFG &= ~AUDCODEC_PLL_CAL_CFG_EN;
213 if (pll_cnt < target_cnt)
214 {
215 fc_vco = fc_vco + delta_fc_vco;
216 delta_cnt = target_cnt - pll_cnt;
217 }
218 else if (pll_cnt > target_cnt)
219 {
220 fc_vco = fc_vco - delta_fc_vco;
221 delta_cnt = pll_cnt - target_cnt;
222 }
223 delta_fc_vco = delta_fc_vco >> 1;
224 }
225 //rt_kprintf("call par CFG1(%x)\r\n", hwp_audcodec->PLL_CFG1);
226 fc_vco_min = fc_vco - 1;
227 if (fc_vco == 31)
228 {
229 fc_vco_max = fc_vco;
230 }
231 else
232 {
233 fc_vco_max = fc_vco + 1;
234 }
235
236 hwp_audcodec->PLL_CFG0 &= ~AUDCODEC_PLL_CFG0_FC_VCO;
237 hwp_audcodec->PLL_CFG0 |= (fc_vco_min << AUDCODEC_PLL_CFG0_FC_VCO_Pos);
238 hwp_audcodec->PLL_CAL_CFG |= AUDCODEC_PLL_CAL_CFG_EN;
239 //rt_kprintf("fc %d, xtal %d, pll %d\r\n", fc_vco, xtal_cnt, pll_cnt);
240 while (!(hwp_audcodec->PLL_CAL_CFG & AUDCODEC_PLL_CAL_CFG_DONE_Msk));
241 pll_cnt = (hwp_audcodec->PLL_CAL_RESULT >> AUDCODEC_PLL_CAL_RESULT_PLL_CNT_Pos);
242 hwp_audcodec->PLL_CAL_CFG &= ~AUDCODEC_PLL_CAL_CFG_EN;
243 if (pll_cnt < target_cnt)
244 {
245 delta_cnt_min = target_cnt - pll_cnt;
246 }
247 else if (pll_cnt > target_cnt)
248 {
249 delta_cnt_min = pll_cnt - target_cnt;
250 }
251
252 hwp_audcodec->PLL_CFG0 &= ~AUDCODEC_PLL_CFG0_FC_VCO;
253 hwp_audcodec->PLL_CFG0 |= (fc_vco_max << AUDCODEC_PLL_CFG0_FC_VCO_Pos);
254 hwp_audcodec->PLL_CAL_CFG |= AUDCODEC_PLL_CAL_CFG_EN;
255 while (!(hwp_audcodec->PLL_CAL_CFG & AUDCODEC_PLL_CAL_CFG_DONE_Msk));
256 pll_cnt = (hwp_audcodec->PLL_CAL_RESULT >> AUDCODEC_PLL_CAL_RESULT_PLL_CNT_Pos);
257 hwp_audcodec->PLL_CAL_CFG &= ~AUDCODEC_PLL_CAL_CFG_EN;
258 if (pll_cnt < target_cnt)
259 {
260 delta_cnt_max = target_cnt - pll_cnt;
261 }
262 else if (pll_cnt > target_cnt)
263 {
264 delta_cnt_max = pll_cnt - target_cnt;
265 }
266
267 hwp_audcodec->PLL_CFG0 &= ~AUDCODEC_PLL_CFG0_FC_VCO;
268
269 if (delta_cnt_min <= delta_cnt && delta_cnt_min <= delta_cnt_max)
270 {
271 hwp_audcodec->PLL_CFG0 |= (fc_vco_min << AUDCODEC_PLL_CFG0_FC_VCO_Pos);
272 }
273 else if (delta_cnt_max <= delta_cnt && delta_cnt_max <= delta_cnt_min)
274 {
275 hwp_audcodec->PLL_CFG0 |= (fc_vco_max << AUDCODEC_PLL_CFG0_FC_VCO_Pos);
276 }
277 else
278 {
279 hwp_audcodec->PLL_CFG0 |= (fc_vco << AUDCODEC_PLL_CFG0_FC_VCO_Pos);
280 }
281
282 hwp_audcodec->PLL_CFG2 &= ~AUDCODEC_PLL_CFG2_EN_LF_VCIN;
283 hwp_audcodec->PLL_CFG0 &= ~AUDCODEC_PLL_CFG0_OPEN;
284
285 //-----------------step 4------------------//
286 // set pll to 49.152M
287 // wait 50us
288 //wait(2500);
289 HAL_Delay_us(50);
290
291 do
292 {
293 test_result = updata_pll_freq(freq_type);
294 }
295 while (test_result != 0);
296
297 set_pll_state(1);
298 set_pll_freq_type(freq_type);
299 }
300 else if (freq_type != get_pll_freq_type())
301 {
302 do
303 {
304 test_result = updata_pll_freq(freq_type);
305 }
306 while (test_result != 0);
307 set_pll_freq_type(freq_type);
308 }
309
310
311 return test_result;
312 }
bf0_disable_pll()313 __weak void bf0_disable_pll()
314 {
315 HAL_TURN_OFF_PLL();
316 set_pll_state(0);
317 //rt_kprintf("PLL disable\n");
318 }
319
HAL_AUDCODEC_Config_Analog_DACPath(AUDCODE_DAC_CLK_CONFIG_TYPE * cfg)320 __HAL_ROM_USED HAL_StatusTypeDef HAL_AUDCODEC_Config_Analog_DACPath(AUDCODE_DAC_CLK_CONFIG_TYPE *cfg)
321 {
322 HAL_DBG_printf("config Aanlog DACPath\n");
323 //-----------------step 5------------------//
324 // turn on refgen
325 // hwp_audcodec->BG_CFG0 &= ~AUDCODEC_BG_CFG0_VREF_SEL;
326 // hwp_audcodec->BG_CFG0 |= (7 << AUDCODEC_BG_CFG0_VREF_SEL_Pos); // AVDD = 3.3V
327 //hwp_audcodec->BG_CFG0 |= (2 << AUDCODEC_BG_CFG0_VREF_SEL_Pos); // AVDD = 1.8V
328 // hwp_audcodec->REFGEN_CFG &= ~AUDCODEC_REFGEN_CFG_EN_CHOP;
329 // hwp_audcodec->REFGEN_CFG |= AUDCODEC_REFGEN_CFG_EN;
330 // hwp_audcodec->PLL_CFG5 = AUDCODEC_PLL_CFG5_EN_CLK_CHOP_BG |
331 // AUDCODEC_PLL_CFG5_EN_CLK_CHOP_REFGEN;
332 // HAL_Delay(2);// wait 2ms
333
334 //-----------------step 6------------------//
335 // turn on hp dac1 and dac2 analog
336 // dac1 and dac2 clock
337 hwp_audcodec->PLL_CFG4 &= ~AUDCODEC_PLL_CFG4_SEL_CLK_DAC;
338 hwp_audcodec->PLL_CFG4 &= ~AUDCODEC_PLL_CFG4_SEL_CLK_DAC_SOURCE;
339 hwp_audcodec->PLL_CFG4 |= (1 << AUDCODEC_PLL_CFG4_EN_CLK_CHOP_DAC_Pos) |
340 (1 << AUDCODEC_PLL_CFG4_EN_CLK_DAC_Pos) |
341 (cfg->sel_clk_dac_source << AUDCODEC_PLL_CFG4_SEL_CLK_DAC_SOURCE_Pos) | // select xtal
342 (cfg->sel_clk_dac << AUDCODEC_PLL_CFG4_SEL_CLK_DAC_Pos) |
343 (1 << AUDCODEC_PLL_CFG4_EN_CLK_DIG_Pos);
344
345 hwp_audcodec->PLL_CFG5 |= (1 << AUDCODEC_PLL_CFG5_EN_CLK_CHOP_BG_Pos) | //
346 (1 << AUDCODEC_PLL_CFG5_EN_CLK_CHOP_REFGEN_Pos); //
347
348 //if (pll_cfg2_reset == 0)
349 {
350 hwp_audcodec->PLL_CFG2 &= ~AUDCODEC_PLL_CFG2_RSTB;
351 HAL_Delay_us(100);
352 hwp_audcodec->PLL_CFG2 |= AUDCODEC_PLL_CFG2_RSTB;
353 }
354
355 // dac1 and dac2 power
356 #ifdef SF32LB58X
357 hwp_audcodec->DAC1_CFG |= AUDCODEC_DAC1_CFG_LP_MODE;
358 hwp_audcodec->DAC2_CFG |= AUDCODEC_DAC2_CFG_LP_MODE;
359 #else
360 #if AVDD_V18_ENABLE
361 hwp_audcodec->DAC1_CFG |= AUDCODEC_DAC1_CFG_LP_MODE; //1.8v
362 #else
363 hwp_audcodec->DAC1_CFG &= ~AUDCODEC_DAC1_CFG_LP_MODE; //3.3v
364 #endif
365 #endif
366 hwp_audcodec->DAC1_CFG &= ~AUDCODEC_DAC1_CFG_EN_OS_DAC;
367 hwp_audcodec->DAC2_CFG &= ~AUDCODEC_DAC2_CFG_EN_OS_DAC;
368 hwp_audcodec->DAC1_CFG |= AUDCODEC_DAC1_CFG_EN_VCM;
369 #ifdef BSP_ENABLE_DAC2
370 hwp_audcodec->DAC2_CFG |= AUDCODEC_DAC2_CFG_EN_VCM;
371 #else
372 hwp_audcodec->DAC2_CFG &= ~AUDCODEC_DAC2_CFG_EN_VCM;
373 #endif
374 // wait 5us
375 //wait(250);
376 HAL_Delay_us(5);
377 hwp_audcodec->DAC1_CFG |= AUDCODEC_DAC1_CFG_EN_AMP;
378 #ifdef BSP_ENABLE_DAC2
379 hwp_audcodec->DAC2_CFG |= AUDCODEC_DAC2_CFG_EN_AMP;
380 #else
381 hwp_audcodec->DAC2_CFG &= ~AUDCODEC_DAC2_CFG_EN_AMP;
382 #endif
383 // wait 1us
384 //wait(50);
385 HAL_Delay_us(1);
386 hwp_audcodec->DAC1_CFG |= AUDCODEC_DAC1_CFG_EN_OS_DAC;
387 hwp_audcodec->DAC2_CFG |= AUDCODEC_DAC2_CFG_EN_OS_DAC;
388 // wait 10us
389 //wait(500);
390 HAL_Delay_us(10);
391 hwp_audcodec->DAC1_CFG |= AUDCODEC_DAC1_CFG_EN_DAC;
392 #ifdef BSP_ENABLE_DAC2
393 hwp_audcodec->DAC2_CFG |= AUDCODEC_DAC2_CFG_EN_DAC;
394 #else
395 hwp_audcodec->DAC2_CFG &= ~AUDCODEC_DAC2_CFG_EN_DAC;
396 #endif
397 // wait 10us
398 //wait(500);
399 HAL_Delay_us(10);
400 hwp_audcodec->DAC1_CFG &= ~AUDCODEC_DAC1_CFG_SR;
401 hwp_audcodec->DAC2_CFG &= ~AUDCODEC_DAC2_CFG_SR;
402 pll_cfg2_reset |= (1 << HAL_AUDCODEC_DAC_CH0);
403 return HAL_OK;
404 }
405
HAL_TURN_OFF_PLL()406 void HAL_TURN_OFF_PLL()
407 {
408 pll_cfg2_reset = 0;
409 // turn off pll
410 hwp_audcodec->PLL_CFG0 &= ~AUDCODEC_PLL_CFG0_EN_IARY;
411 hwp_audcodec->PLL_CFG0 &= ~AUDCODEC_PLL_CFG0_EN_VCO;
412 hwp_audcodec->PLL_CFG0 &= ~AUDCODEC_PLL_CFG0_EN_ANA;
413 hwp_audcodec->PLL_CFG2 &= ~AUDCODEC_PLL_CFG2_EN_DIG;
414 hwp_audcodec->PLL_CFG3 &= ~AUDCODEC_PLL_CFG3_EN_SDM;
415 hwp_audcodec->PLL_CFG4 &= ~AUDCODEC_PLL_CFG4_EN_CLK_DIG;
416
417 // turn off refgen
418 hwp_audcodec->REFGEN_CFG &= ~AUDCODEC_REFGEN_CFG_EN;
419 #if 1
420 // turn off bandgap
421 hwp_audcodec->BG_CFG1 = 0;
422 hwp_audcodec->BG_CFG2 = 0;
423 hwp_audcodec->BG_CFG0 &= ~AUDCODEC_BG_CFG0_EN;
424 hwp_audcodec->BG_CFG0 &= ~AUDCODEC_BG_CFG0_EN_SMPL;
425 #endif
426 HAL_DBG_printf("turn off pll\n");
427
428 }
HAL_TURN_ON_PLL()429 void HAL_TURN_ON_PLL()
430 {
431 HAL_DBG_printf("turn on pll\n");
432 //-----------------step 2------------------//
433 // turn on bandgap
434 hwp_audcodec->BG_CFG0 = (1 << AUDCODEC_BG_CFG0_EN_Pos) |
435 (0 << AUDCODEC_BG_CFG0_LP_MODE_Pos) |
436 #if AVDD_V18_ENABLE
437 (2 << AUDCODEC_BG_CFG0_VREF_SEL_Pos) | // 0xc: 3.3v 2:AVDD = 1.8V
438 #else
439 (0xc << AUDCODEC_BG_CFG0_VREF_SEL_Pos) | // 0xc: 3.3v 2:AVDD = 1.8V
440 #endif
441 // (1 << AUDCODEC_BG_CFG0_EN_CHOP_Pos) |
442 (0 << AUDCODEC_BG_CFG0_EN_SMPL_Pos) |
443 (1 << AUDCODEC_BG_CFG0_EN_RCFLT_Pos) |
444 (4 << AUDCODEC_BG_CFG0_MIC_VREF_SEL_Pos) |
445 (1 << AUDCODEC_BG_CFG0_EN_AMP_Pos) | //----
446 (0 << AUDCODEC_BG_CFG0_SET_VC_Pos);
447 // turn on BG sample clock
448 #if 1 //pop noise
449 hwp_audcodec->BG_CFG1 = 0;
450 hwp_audcodec->BG_CFG2 = 0;
451 #else
452 hwp_audcodec->BG_CFG1 = 48000;
453 hwp_audcodec->BG_CFG2 = 48000000;
454 #endif
455 // turn on bandgap
456 // HAL_Delay_us(100);
457 //hwp_audcodec->BG_CFG0 |= AUDCODEC_BG_CFG0_EN_SMPL;
458
459 //-----------------step 3------------------//
460 // pll calibration
461 // wait 100us
462 //wait(5000);
463 HAL_Delay_us(100);
464
465 hwp_audcodec->PLL_CFG0 |= AUDCODEC_PLL_CFG0_EN_IARY;
466 hwp_audcodec->PLL_CFG0 |= AUDCODEC_PLL_CFG0_EN_VCO;
467 hwp_audcodec->PLL_CFG0 |= AUDCODEC_PLL_CFG0_EN_ANA;
468 hwp_audcodec->PLL_CFG0 &= ~AUDCODEC_PLL_CFG0_ICP_SEL_Msk;
469 hwp_audcodec->PLL_CFG0 |= (8 << AUDCODEC_PLL_CFG0_ICP_SEL_Pos);
470 hwp_audcodec->PLL_CFG2 |= AUDCODEC_PLL_CFG2_EN_DIG;
471 hwp_audcodec->PLL_CFG3 |= AUDCODEC_PLL_CFG3_EN_SDM;
472 hwp_audcodec->PLL_CFG4 |= AUDCODEC_PLL_CFG4_EN_CLK_DIG;
473 hwp_audcodec->PLL_CFG1 = (3 << AUDCODEC_PLL_CFG1_R3_SEL_Pos) |
474 (1 << AUDCODEC_PLL_CFG1_RZ_SEL_Pos) |
475 (3 << AUDCODEC_PLL_CFG1_C2_SEL_Pos) |
476 (6 << AUDCODEC_PLL_CFG1_CZ_SEL_Pos) |
477 (0 << AUDCODEC_PLL_CFG1_CSD_RST_Pos) |
478 (0 << AUDCODEC_PLL_CFG1_CSD_EN_Pos);
479 // wait 50us
480 //wait(2500);
481 HAL_Delay_us(50);
482
483 HAL_AUCODEC_Refgen_Init();
484
485 }
486
HAL_AUDCODEC_Close_Analog_DACPath(void)487 __HAL_ROM_USED void HAL_AUDCODEC_Close_Analog_DACPath(void)
488 {
489 hwp_audcodec->DAC1_CFG |= AUDCODEC_DAC1_CFG_SR;
490 hwp_audcodec->DAC2_CFG |= AUDCODEC_DAC2_CFG_SR;
491 // wait 10us
492 //wait(500);
493 HAL_Delay_us(10);
494 hwp_audcodec->DAC1_CFG &= ~AUDCODEC_DAC1_CFG_EN_DAC;
495 hwp_audcodec->DAC2_CFG &= ~AUDCODEC_DAC2_CFG_EN_DAC;
496 // wait 10us
497 //wait(500);
498 HAL_Delay_us(10);
499 hwp_audcodec->DAC1_CFG &= ~AUDCODEC_DAC1_CFG_EN_VCM;
500 hwp_audcodec->DAC2_CFG &= ~AUDCODEC_DAC2_CFG_EN_VCM;
501 // wait 10us
502 //wait(500);
503 HAL_Delay_us(10);
504 hwp_audcodec->DAC1_CFG &= ~AUDCODEC_DAC1_CFG_EN_AMP;
505 hwp_audcodec->DAC2_CFG &= ~AUDCODEC_DAC2_CFG_EN_AMP;
506 hwp_audcodec->DAC1_CFG &= ~AUDCODEC_DAC1_CFG_EN_OS_DAC;
507 hwp_audcodec->DAC2_CFG &= ~AUDCODEC_DAC2_CFG_EN_OS_DAC;
508 HAL_DBG_printf("close Aanlog DACPath\n");
509
510 }
511
HAL_AUCODEC_Refgen_Init(void)512 __HAL_ROM_USED void HAL_AUCODEC_Refgen_Init(void)
513 {
514 HAL_DBG_printf("turn on refgen\n");
515 // turn on refgen
516 //hwp_audcodec->BG_CFG0 &= ~AUDCODEC_BG_CFG0_EN_SMPL;
517 //hwp_audcodec->BG_CFG0 &= ~AUDCODEC_BG_CFG0_VREF_SEL;
518 //hwp_audcodec->BG_CFG0 |= (7 << AUDCODEC_BG_CFG0_VREF_SEL_Pos); // AVDD = 3.3V
519 //hwp_audcodec->BG_CFG0 |= (2 << AUDCODEC_BG_CFG0_VREF_SEL_Pos); // AVDD = 1.8V
520 hwp_audcodec->BG_CFG0 &= ~AUDCODEC_BG_CFG0_EN_SMPL;
521 hwp_audcodec->REFGEN_CFG &= ~AUDCODEC_REFGEN_CFG_EN_CHOP;
522 hwp_audcodec->REFGEN_CFG |= AUDCODEC_REFGEN_CFG_EN;
523 #if AVDD_V18_ENABLE
524 hwp_audcodec->REFGEN_CFG |= AUDCODEC_REFGEN_CFG_LV_MODE;
525 #else
526 hwp_audcodec->REFGEN_CFG &= ~AUDCODEC_REFGEN_CFG_LV_MODE;
527 #endif
528 //hwp_audcodec->PLL_CFG5 = AUDCODEC_PLL_CFG5_EN_CLK_CHOP_BG |
529 // AUDCODEC_PLL_CFG5_EN_CLK_CHOP_REFGEN;
530 MODIFY_REG(hwp_audcodec->PLL_CFG5, AUDCODEC_PLL_CFG5_EN_CLK_CHOP_BG_Msk, \
531 MAKE_REG_VAL(1, AUDCODEC_PLL_CFG5_EN_CLK_CHOP_BG_Msk, AUDCODEC_PLL_CFG5_EN_CLK_CHOP_BG_Pos));
532 MODIFY_REG(hwp_audcodec->PLL_CFG5, AUDCODEC_PLL_CFG5_EN_CLK_CHOP_REFGEN_Msk, \
533 MAKE_REG_VAL(1, AUDCODEC_PLL_CFG5_EN_CLK_CHOP_REFGEN_Msk, AUDCODEC_PLL_CFG5_EN_CLK_CHOP_REFGEN_Pos));
534 HAL_Delay(2); //2ms
535 #if 1
536 hwp_audcodec->BG_CFG0 &= ~AUDCODEC_BG_CFG0_EN_SMPL; //noise pop
537 #else
538 hwp_audcodec->BG_CFG0 |= AUDCODEC_BG_CFG0_EN_SMPL; //noise pop
539 #endif
540 }
541
HAL_AUDCODEC_Config_Analog_ADCPath(AUDCODE_ADC_CLK_CONFIG_TYPE * cfg)542 __HAL_ROM_USED void HAL_AUDCODEC_Config_Analog_ADCPath(AUDCODE_ADC_CLK_CONFIG_TYPE *cfg)
543 {
544 HAL_DBG_printf("config Aanlog ADCPath\n");
545 // turn on lp adc1 and adc2 analog
546 hwp_audcodec->BG_CFG0 &= ~AUDCODEC_BG_CFG0_EN_SMPL;
547 hwp_audcodec->ADC_ANA_CFG |= AUDCODEC_ADC_ANA_CFG_MICBIAS_EN;
548 hwp_audcodec->ADC_ANA_CFG &= ~AUDCODEC_ADC_ANA_CFG_MICBIAS_CHOP_EN;
549 HAL_Delay(2); //2ms
550 #if 1
551 hwp_audcodec->BG_CFG0 &= ~AUDCODEC_BG_CFG0_EN_SMPL; //noise pop
552 #else
553 hwp_audcodec->BG_CFG0 |= AUDCODEC_BG_CFG0_EN_SMPL; //noise pop
554 #endif
555 // adc1 and adc2 clock
556 hwp_audcodec->PLL_CFG6 = (0 << AUDCODEC_PLL_CFG6_SEL_TST_CLK_Pos) |
557 (0 << AUDCODEC_PLL_CFG6_EN_TST_CLK_Pos) |
558 (0 << AUDCODEC_PLL_CFG6_EN_CLK_RCCAL_Pos) |
559 (3 << AUDCODEC_PLL_CFG6_SEL_CLK_CHOP_MICBIAS_Pos) |
560 (1 << AUDCODEC_PLL_CFG6_EN_CLK_CHOP_MICBIAS_Pos) |
561 (cfg->sel_clk_adc << AUDCODEC_PLL_CFG6_SEL_CLK_ADC2_Pos) |
562 (cfg->diva_clk_adc << AUDCODEC_PLL_CFG6_DIVA_CLK_ADC2_Pos) |
563 (1 << AUDCODEC_PLL_CFG6_EN_CLK_ADC2_Pos) |
564 (cfg->sel_clk_adc << AUDCODEC_PLL_CFG6_SEL_CLK_ADC1_Pos) |
565 (cfg->diva_clk_adc << AUDCODEC_PLL_CFG6_DIVA_CLK_ADC1_Pos) |
566 (1 << AUDCODEC_PLL_CFG6_EN_CLK_ADC1_Pos) |
567 (1 << AUDCODEC_PLL_CFG6_SEL_CLK_ADC0_Pos) |
568 (5 << AUDCODEC_PLL_CFG6_DIVA_CLK_ADC0_Pos) |
569 (1 << AUDCODEC_PLL_CFG6_EN_CLK_ADC0_Pos) |
570 (cfg->sel_clk_adc_source << AUDCODEC_PLL_CFG6_SEL_CLK_ADC_SOURCE_Pos);
571
572 //if (pll_cfg2_reset == 0)
573 {
574 hwp_audcodec->PLL_CFG2 &= ~AUDCODEC_PLL_CFG2_RSTB;
575 HAL_Delay(1);
576 hwp_audcodec->PLL_CFG2 |= AUDCODEC_PLL_CFG2_RSTB;
577 }
578
579 hwp_audcodec->ADC1_CFG1 &= ~AUDCODEC_ADC1_CFG1_DIFF_EN;
580 //hwp_audcodec->ADC1_CFG1 |= AUDCODEC_ADC1_CFG1_DIFF_EN;
581 hwp_audcodec->ADC1_CFG1 &= ~AUDCODEC_ADC1_CFG1_DACN_EN;
582
583 hwp_audcodec->ADC1_CFG1 &= ~AUDCODEC_ADC1_CFG1_FSP;
584 hwp_audcodec->ADC1_CFG1 |= (cfg->fsp << AUDCODEC_ADC1_CFG1_FSP_Pos);
585
586 //this make long mic startup pulse
587 hwp_audcodec->ADC1_CFG1 |= AUDCODEC_ADC1_CFG1_VCMST;
588 hwp_audcodec->ADC1_CFG2 |= AUDCODEC_ADC1_CFG2_CLEAR;
589
590 hwp_audcodec->ADC1_CFG1 &= ~AUDCODEC_ADC1_CFG1_GC_Msk;
591 hwp_audcodec->ADC1_CFG1 |= (0x4 << AUDCODEC_ADC1_CFG1_GC_Pos);
592
593 hwp_audcodec->ADC1_CFG2 |= AUDCODEC_ADC1_CFG2_EN;
594 hwp_audcodec->ADC1_CFG2 &= ~AUDCODEC_ADC1_CFG2_RSTB;
595
596 hwp_audcodec->ADC1_CFG1 &= ~AUDCODEC_ADC1_CFG1_VREF_SEL;
597 hwp_audcodec->ADC1_CFG1 |= (2 << AUDCODEC_ADC1_CFG1_VREF_SEL_Pos) ;
598
599 hwp_audcodec->ADC2_CFG1 &= ~AUDCODEC_ADC2_CFG1_FSP;
600 hwp_audcodec->ADC2_CFG1 |= (cfg->fsp << AUDCODEC_ADC2_CFG1_FSP_Pos);
601
602 hwp_audcodec->ADC2_CFG1 |= AUDCODEC_ADC2_CFG1_VCMST;
603 hwp_audcodec->ADC2_CFG2 |= AUDCODEC_ADC2_CFG2_CLEAR;
604
605 hwp_audcodec->ADC2_CFG1 &= ~AUDCODEC_ADC2_CFG1_GC_Msk;
606 hwp_audcodec->ADC2_CFG1 |= (0x1E << AUDCODEC_ADC2_CFG1_GC_Pos);
607
608 hwp_audcodec->ADC2_CFG2 |= AUDCODEC_ADC2_CFG2_EN;
609 hwp_audcodec->ADC2_CFG2 &= ~AUDCODEC_ADC2_CFG2_RSTB;
610
611 hwp_audcodec->ADC2_CFG2 &= ~AUDCODEC_ADC2_CFG1_VREF_SEL;
612 hwp_audcodec->ADC2_CFG2 |= (2 << AUDCODEC_ADC2_CFG1_VREF_SEL_Pos) ;
613 // wait 20ms
614 HAL_Delay(20);
615 //hwp_audcodec->BG_CFG0 |= AUDCODEC_BG_CFG0_EN_SMPL;
616 hwp_audcodec->ADC1_CFG2 |= AUDCODEC_ADC1_CFG2_RSTB;
617 hwp_audcodec->ADC1_CFG1 &= ~AUDCODEC_ADC1_CFG1_VCMST;
618 hwp_audcodec->ADC1_CFG2 &= ~AUDCODEC_ADC1_CFG2_CLEAR;
619 hwp_audcodec->ADC2_CFG2 |= AUDCODEC_ADC2_CFG2_RSTB;
620 hwp_audcodec->ADC2_CFG1 &= ~AUDCODEC_ADC2_CFG1_VCMST;
621 hwp_audcodec->ADC2_CFG2 &= ~AUDCODEC_ADC2_CFG2_CLEAR;
622 pll_cfg2_reset |= (1 << HAL_AUDCODEC_ADC_CH0);
623
624 }
625
HAL_AUDCODEC_Close_Analog_ADCPath(void)626 __HAL_ROM_USED void HAL_AUDCODEC_Close_Analog_ADCPath(void)
627 {
628 // turn off adc
629 hwp_audcodec->ADC1_CFG2 &= ~AUDCODEC_ADC1_CFG2_EN;
630 hwp_audcodec->ADC2_CFG2 &= ~AUDCODEC_ADC2_CFG2_EN;
631 hwp_audcodec->ADC_ANA_CFG &= ~AUDCODEC_ADC_ANA_CFG_MICBIAS_EN;
632 HAL_DBG_printf("close Aanlog ADCPath\n");
633
634 }
635
636
637 /**
638 * @brief Initializes the AUDCODEC according to the specified parameters
639 * in the AUDCODEC_InitTypeDef and create the associated handle.
640 * @param hacodec: pointer to a AUDCODEC_HandleTypeDef structure that contains
641 * the configuration information for AUDCODEC module
642 * @retval HAL status
643 */
HAL_AUDCODEC_Init(AUDCODEC_HandleTypeDef * hacodec)644 __HAL_ROM_USED HAL_StatusTypeDef HAL_AUDCODEC_Init(AUDCODEC_HandleTypeDef *hacodec)
645 {
646 int i = 0;
647 /* Check the AUDCODEC handle allocation */
648 if (hacodec == NULL)
649 {
650 return HAL_ERROR;
651 }
652
653 if (hacodec->State[0] == HAL_AUDCODEC_STATE_RESET)
654 {
655 /* Allocate lock resource and initialize it */
656 hacodec->Lock = HAL_UNLOCKED;
657
658 /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */
659 HAL_AUDCODEC_MspInit(hacodec);
660 }
661
662 for (i = 0; i < HAL_AUDCODEC_INSTANC_CNT; i++)
663 {
664 hacodec->State[i] = HAL_AUDCODEC_STATE_BUSY;
665 }
666
667 // disable and Set delay count
668 //MODIFY_REG(hacodec->Instance->CFG, AUDCODEC_CFG_EN_DLY_SEL_Msk,
669 // MAKE_REG_VAL(hacodec->Init.en_dly_sel, AUDCODEC_CFG_EN_DLY_SEL_Msk, AUDCODEC_CFG_EN_DLY_SEL_Pos));
670 //hacodec->Instance->CFG = MAKE_REG_VAL(hacodec->Init.en_dly_sel, AUDCODEC_CFG_EN_DLY_SEL_Msk, AUDCODEC_CFG_EN_DLY_SEL_Pos);
671 //hacodec->Instance->CFG = MAKE_REG_VAL(hacodec->Init.en_dly_sel, AUDCODEC_CFG_EN_DLY_SEL_Msk, AUDCODEC_CFG_EN_DLY_SEL_Pos);
672
673
674 for (i = 0; i < HAL_AUDCODEC_INSTANC_CNT; i++)
675 if (hacodec->hdma[i] != NULL)
676 hacodec->hdma[i]->Parent = (void *)hacodec;
677
678 for (i = HAL_AUDCODEC_DAC_CH0; i < HAL_AUDCODEC_ADC_CH0; i++)
679 {
680 if (hacodec->hdma[i] != NULL)
681 HAL_AUDCODEC_DMA_Init(hacodec->hdma[i], 1);
682 }
683 for (i = HAL_AUDCODEC_ADC_CH0; i < HAL_AUDCODEC_INSTANC_CNT; i++)
684 {
685 if (hacodec->hdma[i] != NULL)
686 HAL_AUDCODEC_DMA_Init(hacodec->hdma[i], 0);
687 }
688
689 //HAL_AUDCODEC_Config_DACPath(hacodec, &(hacodec->Init.dac_cfg));
690 //HAL_AUDCODEC_Config_ADCPath(hacodec, &(hacodec->Init.adc_cfg));
691
692 hacodec->ErrorCode = HAL_AUDCODEC_ERROR_NONE;
693 for (i = 0; i < HAL_AUDCODEC_INSTANC_CNT; i++)
694 {
695 hacodec->State[i] = HAL_AUDCODEC_STATE_READY;
696 }
697
698 return HAL_OK;
699 }
700
701 /**
702 * @brief DeInitializes the AUDCODEC peripheral
703 * @param hacodec: pointer to a AUDCODEC_HandleTypeDef structure that contains
704 * the configuration information for AUDCODEC module
705 * @retval HAL status
706 */
HAL_AUDCODEC_DeInit(AUDCODEC_HandleTypeDef * hacodec)707 __HAL_ROM_USED HAL_StatusTypeDef HAL_AUDCODEC_DeInit(AUDCODEC_HandleTypeDef *hacodec)
708 {
709 int i;
710
711 /* Check the AUDCODEC handle allocation */
712 if (hacodec == NULL)
713 {
714 return HAL_ERROR;
715 }
716
717
718 for (i = 0; i < HAL_AUDCODEC_INSTANC_CNT; i++)
719 {
720 hacodec->State[i] |= HAL_AUDCODEC_STATE_BUSY;
721 if (hacodec->hdma[i] != NULL)
722 HAL_DMA_DeInit(hacodec->hdma[i]);
723 }
724
725
726 /* Disable the AUDCODEC Peripheral Clock */
727 __HAL_AUDCODEC_DAC_DISABLE(hacodec);
728 __HAL_AUDCODEC_ADC_DISABLE(hacodec);
729
730 /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */
731 HAL_AUDCODEC_MspDeInit(hacodec);
732
733 hacodec->ErrorCode = HAL_AUDCODEC_ERROR_NONE;
734 for (i = 0; i < HAL_AUDCODEC_INSTANC_CNT; i++)
735 {
736 hacodec->State[i] |= HAL_AUDCODEC_STATE_RESET;
737 }
738
739 /* Release Lock */
740 __HAL_UNLOCK(hacodec);
741
742 return HAL_OK;
743 }
744
745 /**
746 * @brief Initializes the AUDCODEC pin setting.
747 * @param hacodec: pointer to a AUDCODEC_HandleTypeDef structure that contains
748 * the configuration information for AUDCODEC module
749 * @retval None
750 */
HAL_AUDCODEC_MspInit(AUDCODEC_HandleTypeDef * hacodec)751 __HAL_ROM_USED void HAL_AUDCODEC_MspInit(AUDCODEC_HandleTypeDef *hacodec)
752 {
753 /* Prevent unused argument(s) compilation warning */
754 UNUSED(hacodec);
755 }
756
757 /**
758 * @brief deunitializes the AUDCODEC pin setting.
759 * @param hacodec: pointer to a AUDCODEC_HandleTypeDef structure that contains
760 * the configuration information for AUDCODEC module
761 * @retval None
762 */
HAL_AUDCODEC_MspDeInit(AUDCODEC_HandleTypeDef * hacodec)763 __HAL_ROM_USED void HAL_AUDCODEC_MspDeInit(AUDCODEC_HandleTypeDef *hacodec)
764 {
765 /* Prevent unused argument(s) compilation warning */
766 UNUSED(hacodec);
767 }
768
769 /**
770 * @brief Set AUDCODEC transmit channel configures.
771 * @param hacodec: pointer to a AUDCODEC_HandleTypeDef structure that contains
772 * the configuration information for AUDCODEC module
773 * @param cfg: configure parameters
774 * @retval HAL status
775 */
HAL_AUDCODEC_Config_TChanel(AUDCODEC_HandleTypeDef * hacodec,int channel,AUDCODEC_DACCfgTypeDef * cfg)776 __HAL_ROM_USED HAL_StatusTypeDef HAL_AUDCODEC_Config_TChanel(AUDCODEC_HandleTypeDef *hacodec, int channel, AUDCODEC_DACCfgTypeDef *cfg)
777 {
778 AUDCODE_DAC_CLK_CONFIG_TYPE *dac_clk = cfg->dac_clk;
779
780 /* Check the AUDCODEC handle allocation */
781 if (hacodec == NULL)
782 {
783 return HAL_ERROR;
784 }
785
786 hacodec->Instance->CFG |= (3 << AUDCODEC_CFG_ADC_EN_DLY_SEL_Pos);
787 hacodec->Instance->DAC_CFG = (dac_clk->osr_sel << AUDCODEC_DAC_CFG_OSR_SEL_Pos) |
788 (cfg->opmode << AUDCODEC_DAC_CFG_OP_MODE_Pos) |
789 (0 << AUDCODEC_DAC_CFG_PATH_RESET_Pos) |
790 (dac_clk->clk_src_sel << AUDCODEC_DAC_CFG_CLK_SRC_SEL_Pos) |
791 (dac_clk->clk_div << AUDCODEC_DAC_CFG_CLK_DIV_Pos);
792 switch (channel)
793 {
794 case 0:
795 hacodec->Instance->DAC_CH0_CFG = (1 << AUDCODEC_DAC_CH0_CFG_ENABLE_Pos) |
796 (0 << AUDCODEC_DAC_CH0_CFG_DOUT_MUTE_Pos) |
797 (2 << AUDCODEC_DAC_CH0_CFG_DEM_MODE_Pos) |
798 (0 << AUDCODEC_DAC_CH0_CFG_DMA_EN_Pos) |
799 (6 << AUDCODEC_DAC_CH0_CFG_ROUGH_VOL_Pos) |
800 (0 << AUDCODEC_DAC_CH0_CFG_FINE_VOL_Pos) |
801 (1 << AUDCODEC_DAC_CH0_CFG_DATA_FORMAT_Pos) |
802 (dac_clk->sinc_gain << AUDCODEC_DAC_CH0_CFG_SINC_GAIN_Pos) |
803 (0 << AUDCODEC_DAC_CH0_CFG_DITHER_GAIN_Pos) |
804 (0 << AUDCODEC_DAC_CH0_CFG_DITHER_EN_Pos) |
805 (0 << AUDCODEC_DAC_CH0_CFG_CLK_ANA_POL_Pos);
806
807 hacodec->Instance->DAC_CH0_CFG_EXT = (1 << AUDCODEC_DAC_CH0_CFG_EXT_RAMP_EN_Pos) |
808 (1 << AUDCODEC_DAC_CH0_CFG_EXT_RAMP_MODE_Pos) |
809 (1 << AUDCODEC_DAC_CH0_CFG_EXT_ZERO_ADJUST_EN_Pos) |
810 (2 << AUDCODEC_DAC_CH0_CFG_EXT_RAMP_INTERVAL_Pos) |
811 (0 << AUDCODEC_DAC_CH0_CFG_EXT_RAMP_STAT_Pos);
812
813 hacodec->Instance->DAC_CH0_DEBUG = (0 << AUDCODEC_DAC_CH0_DEBUG_BYPASS_Pos) |
814 (0xFF << AUDCODEC_DAC_CH0_DEBUG_DATA_OUT_Pos);
815 //hacodec->Instance->DAC_CH0_DC = MAKE_REG_VAL(cfg->dc_offset, AUDCODEC_DAC_CH0_DC_OFFSET_Msk, AUDCODEC_DAC_CH0_DC_OFFSET_Pos);
816 break;
817 case 1:
818 hacodec->Instance->DAC_CH1_CFG = (1 << AUDCODEC_DAC_CH0_CFG_ENABLE_Pos) |
819 (0 << AUDCODEC_DAC_CH0_CFG_DOUT_MUTE_Pos) |
820 (2 << AUDCODEC_DAC_CH0_CFG_DEM_MODE_Pos) |
821 (0 << AUDCODEC_DAC_CH0_CFG_DMA_EN_Pos) |
822 (6 << AUDCODEC_DAC_CH0_CFG_ROUGH_VOL_Pos) |
823 (0 << AUDCODEC_DAC_CH0_CFG_FINE_VOL_Pos) |
824 (1 << AUDCODEC_DAC_CH0_CFG_DATA_FORMAT_Pos) |
825 (dac_clk->sinc_gain << AUDCODEC_DAC_CH0_CFG_SINC_GAIN_Pos) |
826 (0 << AUDCODEC_DAC_CH0_CFG_DITHER_GAIN_Pos) |
827 (0 << AUDCODEC_DAC_CH0_CFG_DITHER_EN_Pos) |
828 (0 << AUDCODEC_DAC_CH0_CFG_CLK_ANA_POL_Pos);
829
830 hacodec->Instance->DAC_CH1_CFG_EXT = (1 << AUDCODEC_DAC_CH0_CFG_EXT_RAMP_EN_Pos) |
831 (1 << AUDCODEC_DAC_CH0_CFG_EXT_RAMP_MODE_Pos) |
832 (1 << AUDCODEC_DAC_CH0_CFG_EXT_ZERO_ADJUST_EN_Pos) |
833 (2 << AUDCODEC_DAC_CH0_CFG_EXT_RAMP_INTERVAL_Pos) |
834 (0 << AUDCODEC_DAC_CH0_CFG_EXT_RAMP_STAT_Pos);
835
836 hacodec->Instance->DAC_CH1_DEBUG = (0 << AUDCODEC_DAC_CH0_DEBUG_BYPASS_Pos) |
837 (0xFF << AUDCODEC_DAC_CH0_DEBUG_DATA_OUT_Pos);
838 //hacodec->Instance->DAC_CH1_DC = MAKE_REG_VAL(cfg->dc_offset, AUDCODEC_DAC_CH1_DC_OFFSET_Msk, AUDCODEC_DAC_CH1_DC_OFFSET_Pos);
839 break;
840 default:
841 return HAL_ERROR;
842 }
843
844 return HAL_OK;
845 }
846
847 /**
848 * @brief Set AUDCODEC Receive configures.
849 * @param hacodec: pointer to a AUDCODEC_HandleTypeDef structure that contains
850 * the configuration information for AUDCODEC module
851 * @param cfg: configure parameters
852 * @retval HAL status
853 */
HAL_AUDCODEC_Config_RChanel(AUDCODEC_HandleTypeDef * hacodec,int channel,AUDCODEC_ADCCfgTypeDef * cfg)854 __HAL_ROM_USED HAL_StatusTypeDef HAL_AUDCODEC_Config_RChanel(AUDCODEC_HandleTypeDef *hacodec, int channel, AUDCODEC_ADCCfgTypeDef *cfg)
855 {
856 AUDCODE_ADC_CLK_CONFIG_TYPE *adc_clk = cfg->adc_clk;
857
858 /* Check the AUDCODEC handle allocation */
859 if (hacodec == NULL)
860 {
861 return HAL_ERROR;
862 }
863
864 hacodec->Instance->ADC_CFG = (adc_clk->osr_sel << AUDCODEC_ADC_CFG_OSR_SEL_Pos) |
865 (cfg->opmode << AUDCODEC_ADC_CFG_OP_MODE_Pos) | // 2 for test
866 (0 << AUDCODEC_ADC_CFG_PATH_RESET_Pos) |
867 (adc_clk->clk_src_sel << AUDCODEC_ADC_CFG_CLK_SRC_SEL_Pos) |
868 (adc_clk->clk_div << AUDCODEC_ADC_CFG_CLK_DIV_Pos);
869
870 //hacodec->Instance->ADC_CFG = 0x508;//0x508; 510:raw
871
872 switch (channel)
873 {
874 case 0:
875
876 hacodec->Instance->ADC_CH0_CFG = (1 << AUDCODEC_ADC_CH0_CFG_ENABLE_Pos) |
877 (0 << AUDCODEC_ADC_CH0_CFG_HPF_BYPASS_Pos) |
878 (0x7 << AUDCODEC_ADC_CH0_CFG_HPF_COEF_Pos) |
879 (0 << AUDCODEC_ADC_CH0_CFG_STB_INV_Pos) |
880 (0 << AUDCODEC_ADC_CH0_CFG_DMA_EN_Pos) |
881 (0xc << AUDCODEC_ADC_CH0_CFG_ROUGH_VOL_Pos) |
882 (0 << AUDCODEC_ADC_CH0_CFG_FINE_VOL_Pos) |
883 (1 << AUDCODEC_ADC_CH0_CFG_DATA_FORMAT_Pos); //16bit
884 //hacodec->Instance->ADC_CH0_CFG = 0x10ABD;
885 break;
886 case 1:
887
888 hacodec->Instance->ADC_CH1_CFG = (1 << AUDCODEC_ADC_CH0_CFG_ENABLE_Pos) |
889 (0 << AUDCODEC_ADC_CH0_CFG_HPF_BYPASS_Pos) |
890 (0xf << AUDCODEC_ADC_CH0_CFG_HPF_COEF_Pos) |
891 (0 << AUDCODEC_ADC_CH0_CFG_STB_INV_Pos) |
892 (0 << AUDCODEC_ADC_CH0_CFG_DMA_EN_Pos) |
893 (0xc << AUDCODEC_ADC_CH0_CFG_ROUGH_VOL_Pos) |
894 (0 << AUDCODEC_ADC_CH0_CFG_FINE_VOL_Pos) |
895 (1 << AUDCODEC_ADC_CH0_CFG_DATA_FORMAT_Pos); //16bit
896 break;
897 default:
898 return HAL_ERROR;
899 }
900
901 return HAL_OK;
902 }
903
904
905 /**
906 * @brief all channel disable
907 * @param hacodec -pointer to a AUDCODEC_HandleTypeDef structure that contains
908 * the configuration information for AUDCODEC module
909 * @param ch_type_bit : bit0 is dac, bit1 is adc
910 * @return HAL status
911 */
HAL_AUDCODEC_Clear_All_Channel(AUDCODEC_HandleTypeDef * hacodec,uint8_t ch_type_bit)912 __HAL_ROM_USED HAL_StatusTypeDef HAL_AUDCODEC_Clear_All_Channel(AUDCODEC_HandleTypeDef *hacodec, uint8_t ch_type_bit)
913 {
914 if (ch_type_bit & 0x1)
915 {
916 __HAL_AUDCODEC_DAC_CH0_DISABLE(hacodec);
917 __HAL_AUDCODEC_DAC_CH1_DISABLE(hacodec);
918 hacodec->Instance->DAC_CFG |= AUDCODEC_DAC_CFG_PATH_RESET;
919 hacodec->Instance->DAC_CFG &= ~AUDCODEC_DAC_CFG_PATH_RESET;
920 pll_cfg2_reset &= ~(1 << HAL_AUDCODEC_DAC_CH0);
921 }
922
923 if (ch_type_bit & 0x2)
924 {
925 __HAL_AUDCODEC_ADC_CH0_DISABLE(hacodec);
926 __HAL_AUDCODEC_ADC_CH1_DISABLE(hacodec);
927 hacodec->Instance->ADC_CFG |= AUDCODEC_ADC_CFG_PATH_RESET;
928 hacodec->Instance->ADC_CFG &= ~AUDCODEC_ADC_CFG_PATH_RESET;
929 pll_cfg2_reset &= ~(1 << HAL_AUDCODEC_ADC_CH0);
930 }
931
932 return HAL_OK;
933 }
934
935 /**
936 * @brief Configure DAC path volume.
937 * @param hacodec: pointer to a AUDCODEC_HandleTypeDef structure that contains
938 * the configuration information for AUDCODEC module
939 * @param channel: channel 0 or 1
940 * @param volume: configure volume -36dB~54dB, unit is 0.5db, use fix point Q15.1 format
941 * @retval HAL status
942 */
HAL_AUDCODEC_Config_DACPath_Volume(AUDCODEC_HandleTypeDef * hacodec,int channel,int volume)943 __HAL_ROM_USED HAL_StatusTypeDef HAL_AUDCODEC_Config_DACPath_Volume(AUDCODEC_HandleTypeDef *hacodec, int channel, int volume)
944 {
945 uint32_t rough_vol, fine_vol;
946 int volume2;
947 /* Check the AUDCODEC handle allocation */
948 if (hacodec == NULL)
949 {
950 return HAL_ERROR;
951 }
952
953 if ((channel < 0) || (channel > 1))
954 {
955 return HAL_ERROR;
956 }
957
958 if (volume >= 0)
959 {
960 volume2 = volume;
961 }
962 else
963 {
964 volume2 = 0 - volume;
965 }
966
967 if (volume2 & 1)
968 {
969 fine_vol = 1;
970 }
971 else
972 {
973 fine_vol = 0;
974 }
975
976 volume2 = (volume2 >> 1);
977
978 if (volume < 0)
979 {
980 volume = 0 - volume2;
981 if (fine_vol)
982 volume--;
983 }
984 else
985 volume = volume2;
986
987 //HAL_DBG_printf("codec vol=%d, 0.5 on/off=%d", volume, fine_vol);
988
989 if ((volume < -36) || (volume > 54) || (volume == 54 && fine_vol))
990 {
991 return HAL_ERROR;
992 }
993
994 rough_vol = (volume + 36) / 6;
995 fine_vol = fine_vol + (((volume + 36) % 6) << 1);
996
997 if (channel == 0)
998 {
999 MODIFY_REG(hacodec->Instance->DAC_CH0_CFG, AUDCODEC_DAC_CH0_CFG_ROUGH_VOL_Msk | AUDCODEC_DAC_CH0_CFG_FINE_VOL_Msk, \
1000 MAKE_REG_VAL(rough_vol, AUDCODEC_DAC_CH0_CFG_ROUGH_VOL_Msk, AUDCODEC_DAC_CH0_CFG_ROUGH_VOL_Pos) |
1001 MAKE_REG_VAL(fine_vol, AUDCODEC_DAC_CH0_CFG_FINE_VOL_Msk, AUDCODEC_DAC_CH0_CFG_FINE_VOL_Pos));
1002 }
1003 else
1004 {
1005 MODIFY_REG(hacodec->Instance->DAC_CH1_CFG, AUDCODEC_DAC_CH0_CFG_ROUGH_VOL_Msk | AUDCODEC_DAC_CH0_CFG_FINE_VOL_Msk, \
1006 MAKE_REG_VAL(rough_vol, AUDCODEC_DAC_CH0_CFG_ROUGH_VOL_Msk, AUDCODEC_DAC_CH0_CFG_ROUGH_VOL_Pos) |
1007 MAKE_REG_VAL(fine_vol, AUDCODEC_DAC_CH0_CFG_FINE_VOL_Msk, AUDCODEC_DAC_CH0_CFG_FINE_VOL_Pos));
1008 }
1009
1010 HAL_DBG_printf("set volume rough:%d, fine:%d, cfg0:0x%x", rough_vol, fine_vol, hacodec->Instance->DAC_CH0_CFG);
1011
1012 return HAL_OK;
1013 }
1014
1015 /**
1016 * @brief Configure ADC path volume.
1017 * @param hacodec: pointer to a AUDCODEC_HandleTypeDef structure that contains
1018 * the configuration information for AUDCODEC module
1019 * @param channel: channel 0 or 1
1020 * @param volume: configure volume -36dB~54dB
1021 * @retval HAL status
1022 */
HAL_AUDCODEC_Config_ADCPath_Volume(AUDCODEC_HandleTypeDef * hacodec,int channel,int volume)1023 __HAL_ROM_USED HAL_StatusTypeDef HAL_AUDCODEC_Config_ADCPath_Volume(AUDCODEC_HandleTypeDef *hacodec, int channel, int volume)
1024 {
1025 uint32_t rough_vol, fine_vol;
1026
1027 /* Check the AUDCODEC handle allocation */
1028 if (hacodec == NULL)
1029 {
1030 return HAL_ERROR;
1031 }
1032
1033 if ((channel < 0) || (channel > 1))
1034 {
1035 return HAL_ERROR;
1036 }
1037
1038 if ((volume < -36) || (volume > 54))
1039 {
1040 return HAL_ERROR;
1041 }
1042
1043 rough_vol = (volume + 36) / 6;
1044 fine_vol = ((volume + 36) % 6) << 1;
1045
1046 if (channel == 0)
1047 {
1048 MODIFY_REG(hacodec->Instance->ADC_CH0_CFG, AUDCODEC_ADC_CH0_CFG_ROUGH_VOL_Msk | AUDCODEC_ADC_CH0_CFG_FINE_VOL_Msk, \
1049 MAKE_REG_VAL(rough_vol, AUDCODEC_ADC_CH0_CFG_ROUGH_VOL_Msk, AUDCODEC_ADC_CH0_CFG_ROUGH_VOL_Pos) |
1050 MAKE_REG_VAL(fine_vol, AUDCODEC_ADC_CH0_CFG_FINE_VOL_Msk, AUDCODEC_ADC_CH0_CFG_FINE_VOL_Pos));
1051 }
1052 else
1053 {
1054 MODIFY_REG(hacodec->Instance->ADC_CH1_CFG, AUDCODEC_ADC_CH0_CFG_ROUGH_VOL_Msk | AUDCODEC_ADC_CH0_CFG_FINE_VOL_Msk, \
1055 MAKE_REG_VAL(rough_vol, AUDCODEC_ADC_CH0_CFG_ROUGH_VOL_Msk, AUDCODEC_ADC_CH0_CFG_ROUGH_VOL_Pos) |
1056 MAKE_REG_VAL(fine_vol, AUDCODEC_ADC_CH0_CFG_FINE_VOL_Msk, AUDCODEC_ADC_CH0_CFG_FINE_VOL_Pos));
1057 }
1058
1059 //LOG_E("set ADC volume rough:%d, fine:%d, cfg0:0x%x", rough_vol, fine_vol, hacodec->Instance->DAC_CH0_CFG);
1060
1061 return HAL_OK;
1062 }
1063
1064
1065 /**
1066 * @brief Config DAC path.
1067 * @param hacodec: pointer to a AUDCODEC_HandleTypeDef structure that contains
1068 * the configuration information for AUDCODEC module
1069 * @retval HAL status
1070 */
HAL_AUDCODEC_Config_DACPath(AUDCODEC_HandleTypeDef * hacodec,uint16_t bypass)1071 __HAL_ROM_USED HAL_StatusTypeDef HAL_AUDCODEC_Config_DACPath(AUDCODEC_HandleTypeDef *hacodec, uint16_t bypass)
1072 {
1073 /* Check the AUDCODEC handle allocation */
1074 if (hacodec == NULL)
1075 {
1076 return HAL_ERROR;
1077 }
1078
1079 if (bypass)
1080 {
1081 MODIFY_REG(hacodec->Instance->DAC_CH0_CFG, AUDCODEC_DAC_CH0_CFG_DOUT_MUTE_Msk, \
1082 MAKE_REG_VAL(1, AUDCODEC_DAC_CH0_CFG_DOUT_MUTE_Msk, AUDCODEC_DAC_CH0_CFG_DOUT_MUTE_Pos));
1083
1084 hacodec->Instance->DAC_CH0_DEBUG = (1 << AUDCODEC_DAC_CH0_DEBUG_BYPASS_Pos) |
1085 (0xFF << AUDCODEC_DAC_CH0_DEBUG_DATA_OUT_Pos);
1086
1087 MODIFY_REG(hacodec->Instance->DAC_CH1_CFG, AUDCODEC_DAC_CH1_CFG_DOUT_MUTE_Msk, \
1088 MAKE_REG_VAL(1, AUDCODEC_DAC_CH1_CFG_DOUT_MUTE_Msk, AUDCODEC_DAC_CH1_CFG_DOUT_MUTE_Pos));
1089
1090 hacodec->Instance->DAC_CH1_DEBUG = (1 << AUDCODEC_DAC_CH1_DEBUG_BYPASS_Pos) |
1091 (0xFF << AUDCODEC_DAC_CH1_DEBUG_DATA_OUT_Pos);
1092 }
1093 else
1094 {
1095 MODIFY_REG(hacodec->Instance->DAC_CH0_CFG, AUDCODEC_DAC_CH0_CFG_DOUT_MUTE_Msk, \
1096 MAKE_REG_VAL(0, AUDCODEC_DAC_CH0_CFG_DOUT_MUTE_Msk, AUDCODEC_DAC_CH0_CFG_DOUT_MUTE_Pos));
1097 hacodec->Instance->DAC_CH0_DEBUG = (0 << AUDCODEC_DAC_CH0_DEBUG_BYPASS_Pos) |
1098 (0xFF << AUDCODEC_DAC_CH0_DEBUG_DATA_OUT_Pos);
1099 MODIFY_REG(hacodec->Instance->DAC_CH1_CFG, AUDCODEC_DAC_CH1_CFG_DOUT_MUTE_Msk, \
1100 MAKE_REG_VAL(0, AUDCODEC_DAC_CH1_CFG_DOUT_MUTE_Msk, AUDCODEC_DAC_CH1_CFG_DOUT_MUTE_Pos));
1101 hacodec->Instance->DAC_CH1_DEBUG = (0 << AUDCODEC_DAC_CH1_DEBUG_BYPASS_Pos) |
1102 (0xFF << AUDCODEC_DAC_CH1_DEBUG_DATA_OUT_Pos);
1103 }
1104
1105 return HAL_OK;
1106 }
1107
1108 /**
1109 * @brief Configure DAC path mute.
1110 * @param hacodec: pointer to a AUDCODEC_HandleTypeDef structure that contains
1111 * the configuration information for AUDCODEC module
1112 * @param mute: is mute or not
1113 * @retval HAL status
1114 */
HAL_AUDCODEC_Mute_DACPath(AUDCODEC_HandleTypeDef * hacodec,int mute)1115 __HAL_ROM_USED HAL_StatusTypeDef HAL_AUDCODEC_Mute_DACPath(AUDCODEC_HandleTypeDef *hacodec, int mute)
1116 {
1117 static int fine_vol_0, fine_vol_1;
1118
1119 /* Check the AUDCODEC handle allocation */
1120 if (hacodec == NULL)
1121 {
1122 return HAL_ERROR;
1123 }
1124
1125 if (mute)
1126 {
1127 fine_vol_0 = GET_REG_VAL(hacodec->Instance->DAC_CH0_CFG, AUDCODEC_DAC_CH0_CFG_FINE_VOL_Msk, AUDCODEC_DAC_CH0_CFG_FINE_VOL_Pos);
1128 fine_vol_1 = GET_REG_VAL(hacodec->Instance->DAC_CH1_CFG, AUDCODEC_DAC_CH1_CFG_FINE_VOL_Msk, AUDCODEC_DAC_CH1_CFG_FINE_VOL_Pos);
1129 MODIFY_REG(hacodec->Instance->DAC_CH0_CFG, AUDCODEC_DAC_CH0_CFG_FINE_VOL_Msk, \
1130 MAKE_REG_VAL(0xF, AUDCODEC_DAC_CH0_CFG_FINE_VOL_Msk, AUDCODEC_DAC_CH0_CFG_FINE_VOL_Pos));
1131 MODIFY_REG(hacodec->Instance->DAC_CH1_CFG, AUDCODEC_DAC_CH1_CFG_FINE_VOL_Msk, \
1132 MAKE_REG_VAL(0xF, AUDCODEC_DAC_CH1_CFG_FINE_VOL_Msk, AUDCODEC_DAC_CH1_CFG_FINE_VOL_Pos));
1133 }
1134 else
1135 {
1136 MODIFY_REG(hacodec->Instance->DAC_CH0_CFG, AUDCODEC_DAC_CH0_CFG_FINE_VOL_Msk, \
1137 MAKE_REG_VAL(fine_vol_0, AUDCODEC_DAC_CH0_CFG_FINE_VOL_Msk, AUDCODEC_DAC_CH0_CFG_FINE_VOL_Pos));
1138 MODIFY_REG(hacodec->Instance->DAC_CH1_CFG, AUDCODEC_DAC_CH1_CFG_FINE_VOL_Msk, \
1139 MAKE_REG_VAL(fine_vol_1, AUDCODEC_DAC_CH1_CFG_FINE_VOL_Msk, AUDCODEC_DAC_CH1_CFG_FINE_VOL_Pos));
1140 }
1141
1142
1143 return HAL_OK;
1144 }
1145
1146 #if 0
1147
1148 /**
1149 * @brief Configure ADC path.
1150 * @param hacodec: pointer to a AUDCODEC_HandleTypeDef structure that contains
1151 * the configuration information for AUDCODEC module
1152 * @param cfg: configure parameters
1153 * @retval HAL status
1154 */
1155 __HAL_ROM_USED HAL_StatusTypeDef HAL_AUDCODEC_Config_ADCPath(AUDCODEC_HandleTypeDef *hacodec, AUDCODEC_ADCCfgTypeDef *cfg)
1156 {
1157 uint32_t value;
1158
1159 /* Check the AUDCODEC handle allocation */
1160 if (hacodec == NULL)
1161 {
1162 return HAL_ERROR;
1163 }
1164 value = MAKE_REG_VAL(cfg->clk_div, AUDCODEC_ADC_CFG_CLK_DIV_Msk, AUDCODEC_ADC_CFG_CLK_DIV_Pos)
1165 | MAKE_REG_VAL(cfg->clk_src_sel, AUDCODEC_ADC_CFG_CLK_SRC_SEL_Msk, AUDCODEC_ADC_CFG_CLK_SRC_SEL_Pos)
1166 | MAKE_REG_VAL(cfg->op_mode, AUDCODEC_ADC_CFG_OP_MODE_Msk, AUDCODEC_ADC_CFG_OP_MODE_Pos)
1167 | MAKE_REG_VAL(cfg->osr_sel, AUDCODEC_ADC_CFG_OSR_SEL_Msk, AUDCODEC_ADC_CFG_OSR_SEL_Pos);
1168
1169 hacodec->Instance->CFG = value;
1170
1171 return HAL_OK;
1172 }
1173 #endif
HAL_AUDCODEC_DMA_Init(DMA_HandleTypeDef * hdma,uint8_t from_mem)1174 static void HAL_AUDCODEC_DMA_Init(DMA_HandleTypeDef *hdma, uint8_t from_mem)
1175 {
1176 // configure TX DMA, instance and request should be initialized by caller
1177 if (hdma != NULL)
1178 {
1179 if (from_mem)
1180 hdma->Init.Direction = DMA_MEMORY_TO_PERIPH;
1181 else
1182 hdma->Init.Direction = DMA_PERIPH_TO_MEMORY;
1183 hdma->Init.PeriphInc = DMA_PINC_DISABLE;
1184 hdma->Init.MemInc = DMA_MINC_ENABLE;
1185 hdma->Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
1186 hdma->Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
1187 /*Mode will be changed, based on destination select*/
1188 hdma->Init.Mode = DMA_CIRCULAR; //DMA_CIRCULAR; //DMA_CIRCULAR; //DMA_NORMAL;
1189 hdma->Init.Priority = DMA_PRIORITY_HIGH;
1190 hdma->Init.BurstSize = 0;
1191 //hdma->Parent = (void *)hacodec;
1192
1193 HAL_DMA_Init(hdma);
1194 }
1195
1196 }
1197
HAL_AUDCODEC_Transmit_DMA(AUDCODEC_HandleTypeDef * hacodec,uint8_t * pData,uint32_t Size,uint32_t did)1198 HAL_StatusTypeDef HAL_AUDCODEC_Transmit_DMA(AUDCODEC_HandleTypeDef *hacodec, uint8_t *pData, uint32_t Size, uint32_t did)
1199 {
1200 uint32_t txentry;
1201 uint32_t *dmamask;
1202
1203 if ((hacodec == NULL) || (hacodec->hdma[did] == NULL) || (pData == NULL) || (Size == 0U) || (did > HAL_AUDCODEC_DAC_CH1))
1204 {
1205 return HAL_ERROR;
1206 }
1207
1208 /* Process Locked */
1209 __HAL_LOCK(hacodec);
1210
1211 if (did == HAL_AUDCODEC_DAC_CH0) // channel 0
1212 {
1213 txentry = (uint32_t)(&hacodec->Instance->DAC_CH0_ENTRY);
1214 dmamask = (uint32_t *)((uint32_t)&hacodec->Instance->DAC_CH0_CFG);
1215 }
1216 else
1217 {
1218 txentry = (uint32_t)(&hacodec->Instance->DAC_CH1_ENTRY);
1219 dmamask = (uint32_t *)((uint32_t)&hacodec->Instance->DAC_CH1_CFG);
1220 }
1221
1222 if (!(hacodec->State[did] & HAL_AUDCODEC_STATE_BUSY_TX))
1223 {
1224 hacodec->buf[did] = pData;
1225 hacodec->State[did] |= HAL_AUDCODEC_STATE_BUSY_TX;
1226 hacodec->ErrorCode = HAL_AUDCODEC_ERROR_NONE;
1227
1228
1229 // DMA transmit as 32 bits
1230 hacodec->dataSize[did] = Size >> 2;
1231
1232 /* Set the AUDCODEC Tx DMA Half transfert complete callback */
1233 hacodec->hdma[did]->XferHalfCpltCallback = AUDCODEC_DMATxHalfCplt;
1234 __HAL_DMA_SET_CIRCLUAR_MODE(hacodec->hdma[did], DMA_CIRCULAR);
1235
1236 /* Set the AUDCODEC Tx DMA transfert complete callback */
1237 hacodec->hdma[did]->XferCpltCallback = AUDCODEC_DMATxCplt;
1238
1239 /* Set the DMA error callback */
1240 hacodec->hdma[did]->XferErrorCallback = AUDCODEC_DMAError;
1241
1242 /* Enable the Tx DMA Channel */
1243 HAL_DMA_Start_IT(hacodec->hdma[did], (uint32_t)hacodec->buf[did], txentry, hacodec->dataSize[did]);
1244
1245 /* Check if the AUDCODEC Tx request is already enabled */
1246 *dmamask &= ~AUDCODEC_DAC_CH0_CFG_DMA_EN_Msk;
1247 *dmamask |= AUDCODEC_DAC_CH0_CFG_DMA_EN;
1248 /* Check if the AUDCODEC is already enabled */
1249 //__HAL_AUDCODEC_ENABLE(hacodec);
1250
1251 /* Process Unlocked */
1252 __HAL_UNLOCK(hacodec);
1253
1254 return HAL_OK;
1255 }
1256 else
1257 {
1258 /* Process Unlocked */
1259 __HAL_UNLOCK(hacodec);
1260 return HAL_BUSY;
1261 }
1262
1263 return HAL_OK;
1264
1265 }
1266
HAL_AUDCODEC_Receive_DMA(AUDCODEC_HandleTypeDef * hacodec,uint8_t * pData,uint32_t Size,uint32_t did)1267 HAL_StatusTypeDef HAL_AUDCODEC_Receive_DMA(AUDCODEC_HandleTypeDef *hacodec, uint8_t *pData, uint32_t Size, uint32_t did)
1268 {
1269 uint32_t rxentry;
1270 uint32_t *dmamask;
1271
1272 /* check dma handle */
1273 if ((hacodec == NULL) || (hacodec->hdma[did] == NULL) || (pData == NULL) || (Size == 0U) || (did > HAL_AUDCODEC_INSTANC_CNT) || (did < HAL_AUDCODEC_ADC_CH0))
1274 {
1275 return HAL_ERROR;
1276 }
1277
1278 if (hacodec->State[did] & HAL_AUDCODEC_STATE_BUSY_RX)
1279 {
1280 return HAL_BUSY;
1281 }
1282
1283 /* Process Locked */
1284 __HAL_LOCK(hacodec);
1285
1286 if (did == HAL_AUDCODEC_ADC_CH0)
1287 {
1288 rxentry = (uint32_t)(&hacodec->Instance->ADC_CH0_ENTRY);
1289 dmamask = (uint32_t *)((uint32_t)&hacodec->Instance->ADC_CH0_CFG);
1290 }
1291 else
1292 {
1293 rxentry = (uint32_t)(&hacodec->Instance->ADC_CH1_ENTRY);
1294 dmamask = (uint32_t *)((uint32_t)&hacodec->Instance->ADC_CH1_CFG);
1295 }
1296
1297 /* Set the transaction information */
1298 hacodec->State[did] = HAL_AUDCODEC_STATE_BUSY_RX;
1299 hacodec->ErrorCode = HAL_AUDCODEC_ERROR_NONE;
1300
1301 hacodec->buf[did] = pData;
1302 hacodec->dataSize[did] = Size >> 2;
1303
1304 /* Set the AUDCODEC RxDMA Half transfer complete callback */
1305 hacodec->hdma[did]->XferHalfCpltCallback = AUDCODEC_DMAHalfRxCplt;
1306 __HAL_DMA_SET_CIRCLUAR_MODE(hacodec->hdma[did], DMA_CIRCULAR);
1307
1308 /* Set the AUDCODEC Rx DMA transfer complete callback */
1309 hacodec->hdma[did]->XferCpltCallback = AUDCODEC_DMARxCplt;
1310
1311 /* Set the AUDCODEC error callback */
1312 hacodec->hdma[did]->XferErrorCallback = AUDCODEC_DMAError;
1313
1314 /* Set the AUDCODEC AbortCpltCallback */
1315 hacodec->hdma[did]->XferAbortCallback = NULL;
1316
1317
1318 /* Enable the Rx DMA Stream/Channel */
1319 HAL_DMA_Start_IT(hacodec->hdma[did], (uint32_t)(rxentry), (uint32_t)hacodec->buf[did], hacodec->dataSize[did]);
1320
1321 /* Check if the AUDCODEC Rx request is already enabled */
1322 *dmamask &= ~AUDCODEC_ADC_CH0_CFG_DMA_EN_Msk;
1323 *dmamask |= AUDCODEC_ADC_CH0_CFG_DMA_EN;
1324 /* Check if the AUDCODEC is already enabled */
1325 //__HAL_AUDCODEC_ENABLE(hacodec);
1326
1327 /* Process Unlocked */
1328 __HAL_UNLOCK(hacodec);
1329
1330 return HAL_OK;
1331 }
1332
1333
HAL_AUDCODEC_DMAStop(AUDCODEC_HandleTypeDef * hacodec,uint32_t did)1334 HAL_StatusTypeDef HAL_AUDCODEC_DMAStop(AUDCODEC_HandleTypeDef *hacodec, uint32_t did)
1335 {
1336 /* Abort the DMA rx/tx Stream/Channel */
1337 if (hacodec->hdma[did] != NULL)
1338 {
1339 //__HAL_DMA_DISABLE(hacodec->hdma[did]);
1340 HAL_DMA_Abort(hacodec->hdma[did]);
1341 }
1342
1343 switch (did)
1344 {
1345 case HAL_AUDCODEC_DAC_CH0:
1346 hacodec->Instance->DAC_CH0_CFG &= (~AUDCODEC_DAC_CH0_CFG_DMA_EN);
1347 break;
1348 case HAL_AUDCODEC_DAC_CH1:
1349 hacodec->Instance->DAC_CH1_CFG &= (~AUDCODEC_DAC_CH1_CFG_DMA_EN);
1350 break;
1351 case HAL_AUDCODEC_ADC_CH0:
1352 hacodec->Instance->ADC_CH0_CFG &= (~AUDCODEC_ADC_CH0_CFG_DMA_EN);
1353 break;
1354 case HAL_AUDCODEC_ADC_CH1:
1355 hacodec->Instance->ADC_CH1_CFG &= (~AUDCODEC_ADC_CH1_CFG_DMA_EN);
1356 break;
1357 }
1358 //__HAL_AUDCODEC_DISABLE(hacodec);
1359
1360 //hacodec->State = HAL_AUDCODEC_STATE_READY;
1361
1362 return HAL_OK;
1363 }
1364
HAL_AUDCODEC_TxCpltCallback(AUDCODEC_HandleTypeDef * hacodec,int cid)1365 __weak void HAL_AUDCODEC_TxCpltCallback(AUDCODEC_HandleTypeDef *hacodec, int cid)
1366 {
1367 /* Prevent unused argument(s) compilation warning */
1368 UNUSED(hacodec);
1369 UNUSED(cid);
1370
1371 /* NOTE : This function should not be modified, when the callback is needed,
1372 the HAL_AUDCODEC_TxHalfCpltCallback should be implemented in the user file
1373 */
1374
1375 }
1376
HAL_AUDCODEC_TxHalfCpltCallback(AUDCODEC_HandleTypeDef * hacodec,int cid)1377 __weak void HAL_AUDCODEC_TxHalfCpltCallback(AUDCODEC_HandleTypeDef *hacodec, int cid)
1378 {
1379 /* Prevent unused argument(s) compilation warning */
1380 UNUSED(hacodec);
1381 UNUSED(cid);
1382
1383 /* NOTE : This function should not be modified, when the callback is needed,
1384 the HAL_AUDCODEC_TxHalfCpltCallback should be implemented in the user file
1385 */
1386
1387 }
1388
HAL_AUDCODEC_RxHalfCpltCallback(AUDCODEC_HandleTypeDef * hacodec,int cid)1389 __weak void HAL_AUDCODEC_RxHalfCpltCallback(AUDCODEC_HandleTypeDef *hacodec, int cid)
1390 {
1391 /* Prevent unused argument(s) compilation warning */
1392 UNUSED(hacodec);
1393 UNUSED(cid);
1394
1395 /* NOTE : This function should not be modified, when the callback is needed,
1396 the HAL_AUDCODEC_RxHalfCpltCallback should be implemented in the user file
1397 */
1398 }
1399
HAL_AUDCODEC_RxCpltCallback(AUDCODEC_HandleTypeDef * hacodec,int cid)1400 __weak void HAL_AUDCODEC_RxCpltCallback(AUDCODEC_HandleTypeDef *hacodec, int cid)
1401 {
1402 /* Prevent unused argument(s) compilation warning */
1403 UNUSED(hacodec);
1404 UNUSED(cid);
1405
1406 /* NOTE : This function should not be modified, when the callback is needed,
1407 the HAL_AUDCODEC_RxCpltCallback should be implemented in the user file
1408 */
1409 }
1410
HAL_AUDCODEC_ErrorCallback(AUDCODEC_HandleTypeDef * hacodec,int cid)1411 __weak void HAL_AUDCODEC_ErrorCallback(AUDCODEC_HandleTypeDef *hacodec, int cid)
1412 {
1413 /* Prevent unused argument(s) compilation warning */
1414 UNUSED(hacodec);
1415 UNUSED(cid);
1416
1417 /* NOTE : This function should not be modified, when the callback is needed,
1418 the HAL_PDM_ErrorCallback should be implemented in the user file
1419 */
1420 }
1421
HAL_AUDCODEC_AbortCpltCallback(AUDCODEC_HandleTypeDef * hacodec,int cid)1422 __weak void HAL_AUDCODEC_AbortCpltCallback(AUDCODEC_HandleTypeDef *hacodec, int cid)
1423 {
1424 /* Prevent unused argument(s) compilation warning */
1425 UNUSED(hacodec);
1426 UNUSED(cid);
1427
1428 /* NOTE : This function should not be modified, when the callback is needed,
1429 the HAL_PDM_AbortCpltCallback should be implemented in the user file
1430 */
1431 }
1432
1433
AUDCODEC_DMATxCplt(DMA_HandleTypeDef * hdma)1434 static void AUDCODEC_DMATxCplt(DMA_HandleTypeDef *hdma)
1435 {
1436 AUDCODEC_HandleTypeDef *aprc = (AUDCODEC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
1437
1438 int i;
1439 for (i = 0; i < HAL_AUDCODEC_INSTANC_CNT; i++)
1440 if (aprc->hdma[i] == hdma)
1441 break;
1442 if (i >= HAL_AUDCODEC_INSTANC_CNT) // something wrong
1443 return;
1444
1445 HAL_AUDCODEC_TxCpltCallback(aprc, i);
1446 }
1447
1448 /**
1449 * @brief DMA I2S transmit process half complete callback
1450 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
1451 * the configuration information for the specified DMA module.
1452 * @retval None
1453 */
AUDCODEC_DMATxHalfCplt(DMA_HandleTypeDef * hdma)1454 static void AUDCODEC_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
1455 {
1456 AUDCODEC_HandleTypeDef *aprc = (AUDCODEC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
1457 int i;
1458 for (i = 0; i < HAL_AUDCODEC_INSTANC_CNT; i++)
1459 if (aprc->hdma[i] == hdma)
1460 break;
1461 if (i >= HAL_AUDCODEC_INSTANC_CNT) // something wrong
1462 return;
1463
1464 HAL_AUDCODEC_TxHalfCpltCallback(aprc, i);
1465 }
1466
AUDCODEC_DMARxCplt(DMA_HandleTypeDef * hdma)1467 static void AUDCODEC_DMARxCplt(DMA_HandleTypeDef *hdma)
1468 {
1469 AUDCODEC_HandleTypeDef *aprc = (AUDCODEC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
1470 int i;
1471
1472 for (i = HAL_AUDCODEC_DAC_CH0; i < HAL_AUDCODEC_INSTANC_CNT; i++)
1473 if (aprc->hdma[i] == hdma)
1474 break;
1475 if (i >= HAL_AUDCODEC_INSTANC_CNT)
1476 return;
1477
1478 HAL_AUDCODEC_RxCpltCallback(aprc, i);
1479
1480 }
1481
1482 /**
1483 * @brief DMA PDM half receive process complete callback
1484 * @param hdma pointer to a DMA_HandleTypeDef structure that contains
1485 * the configuration information for the specified DMA module.
1486 * @retval None
1487 */
AUDCODEC_DMAHalfRxCplt(DMA_HandleTypeDef * hdma)1488 static void AUDCODEC_DMAHalfRxCplt(DMA_HandleTypeDef *hdma)
1489 {
1490 AUDCODEC_HandleTypeDef *aprc = (AUDCODEC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
1491 int i;
1492 for (i = HAL_AUDCODEC_DAC_CH0; i < HAL_AUDCODEC_INSTANC_CNT; i++)
1493 if (aprc->hdma[i] == hdma)
1494 break;
1495 if (i >= HAL_AUDCODEC_INSTANC_CNT)
1496 return;
1497 HAL_AUDCODEC_RxHalfCpltCallback(aprc, i);
1498 }
1499
1500
1501 /**
1502 * @brief DMA PDM communication error callback.
1503 * @param hdma pointer to a DMA_HandleTypeDef structure that contains
1504 * the configuration information for the specified DMA module.
1505 * @retval None
1506 */
AUDCODEC_DMAError(DMA_HandleTypeDef * hdma)1507 static void AUDCODEC_DMAError(DMA_HandleTypeDef *hdma)
1508 {
1509 AUDCODEC_HandleTypeDef *aprc = (AUDCODEC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
1510 int i;
1511 for (i = 0; i < HAL_AUDCODEC_INSTANC_CNT; i++)
1512 if (aprc->hdma[i] == hdma)
1513 break;
1514 if (i >= HAL_AUDCODEC_INSTANC_CNT)
1515 return;
1516
1517 aprc->State[i] = HAL_AUDCODEC_STATE_READY;
1518 HAL_AUDCODEC_ErrorCallback(aprc, i);
1519 }
1520
1521 #endif /* HAL_AUDCODEC_MODULE_ENABLED */