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