1 /*
2  * SPDX-FileCopyrightText: 2016 STMicroelectronics
3  * SPDX-FileCopyrightText: 2019-2025 SiFli Technologies(Nanjing) Co., Ltd
4  *
5  * SPDX-License-Identifier: BSD-3-Clause AND Apache-2.0
6  */
7 
8 #include "bf0_hal.h"
9 
10 /** @addtogroup BF0_HAL_Driver
11   * @{
12   */
13 
14 /** @defgroup ADC Analog Digital Converter
15   * @brief ADC HAL module driver
16   * @{
17   */
18 
19 #ifdef HAL_ADC_MODULE_ENABLED
20 
21 
22 
23 /* Private typedef -----------------------------------------------------------*/
24 /* Private define ------------------------------------------------------------*/
25 /** @defgroup ADC_Private_Constants ADC Private Constants
26   * @{
27   */
28 
29 
30 /**
31     * @}
32     */
33 
34 /* Private macro -------------------------------------------------------------*/
35 /* Private variables ---------------------------------------------------------*/
36 /* Private function prototypes -----------------------------------------------*/
37 /** @defgroup ADC_Private_Functions ADC Private Functions
38   * @{
39   */
40 
41 
42 static void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma);
43 static void ADC_DMAError(DMA_HandleTypeDef *hdma);
44 
45 /**
46     * @}
47     */
48 
49 /* Exported functions ---------------------------------------------------------*/
50 
51 /** @defgroup ADC_Exported_Functions ADC Exported Functions
52   * @{
53   */
54 
55 /** @defgroup ADC_Exported_Functions_Group1 Initialization/de-initialization functions
56  *  @brief    Initialization and Configuration functions
57  *
58 @verbatim
59  ===============================================================================
60               ##### Initialization and de-initialization functions #####
61  ===============================================================================
62     [..]  This section provides functions allowing to:
63       (+) Initialize and configure the ADC.
64       (+) De-initialize the ADC
65 @endverbatim
66   * @{
67   */
68 
69 /**
70   * @brief  Initializes the ADC peripheral and regular group according to
71   *         parameters specified in structure "ADC_InitTypeDef".
72   * @note   As prerequisite, ADC clock must be configured at RCC top level
73   *         depending on both possible clock sources: APB clock of HSI clock.
74   * @note   Possibility to update parameters on the fly:
75   *         The setting of these parameters is conditioned to ADC state.
76   *         For parameters constraints, see comments of structure
77   *         "ADC_InitTypeDef".
78   * @note   This function configures the ADC within 2 scopes: scope of entire
79   *         ADC and scope of regular group. For parameters details, see comments
80   *         of structure "ADC_InitTypeDef".
81   * @param  hadc ADC handle
82   * @retval HAL status
83   */
HAL_ADC_Init(ADC_HandleTypeDef * hadc)84 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef *hadc)
85 {
86     HAL_StatusTypeDef tmp_hal_status = HAL_OK;
87     uint32_t i;
88 
89     /* Check ADC handle */
90     if (hadc == NULL)
91     {
92         return HAL_ERROR;
93     }
94 
95     /* Actions performed only if ADC is coming from state reset:                */
96     /* - ADC voltage regulator enable                                           */
97     if (hadc->State == HAL_ADC_STATE_RESET)
98     {
99         /* Initialize ADC error code */
100         ADC_CLEAR_ERRORCODE(hadc);
101 
102         /* Allocate lock resource and initialize it */
103         hadc->Lock = HAL_UNLOCKED;
104     }
105 
106     /* Initial ADC Msp */
107     HAL_ADC_MspInit(hadc);
108 
109     /* Configuration of ADC parameters if previous preliminary actions are      */
110     /* correctly completed.                                                     */
111     /* and if there is no conversion on going on regular group (ADC can be      */
112     /* enabled anyway, in case of call of this function to update a parameter   */
113     /* on the fly).                                                             */
114     if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL) &&
115             (tmp_hal_status == HAL_OK))
116     {
117         /* Set ADC state */
118         ADC_STATE_CLR_SET(hadc->State,
119                           HAL_ADC_STATE_REG_BUSY,
120                           HAL_ADC_STATE_BUSY_INTERNAL);
121 
122         /* TODO , Init ADC configure register for analog */
123         //hadc->Instance->ADC_CFG_REG1 = ;
124 
125         /* Set single channel */
126         hadc->Instance->ADC_CFG_REG1 |= GPADC_ADC_CFG_REG1_ANAU_GPADC_SE;
127 
128         i = hadc->Instance->ADC_CTRL_REG;
129         // disable all triger mode by default
130         i &= (~(GPADC_ADC_CTRL_REG_GPIO_TRIG_EN | GPADC_ADC_CTRL_REG_TIMER_TRIG_EN | GPADC_ADC_CTRL_REG_INIT_TIME));
131         // set init time to max
132 #if (GPADC_CALIB_FLOW_VERSION == 1)
133         i |= GPADC_ADC_CTRL_REG_INIT_TIME;
134 #else
135         i |= (8 << GPADC_ADC_CTRL_REG_INIT_TIME_Pos);
136 #endif
137         hadc->Instance->ADC_CTRL_REG = i;
138 #if (GPADC_CALIB_FLOW_VERSION != 1)
139         __HAL_ADC_SET_SAMPLE_WIDTH(hadc, hadc->Init.sample_width);
140         __HAL_ADC_SET_CONV_WIDTH(hadc, hadc->Init.conv_width);
141         __HAL_ADC_SET_DATA_DELAY(hadc, hadc->Init.data_samp_delay);
142         // TODO: Add for Range
143 #else
144         /* Set ADC clock, clk = 12/(div+1) */
145         __HAL_ADC_SET_CLOCK_DIV(hadc, hadc->Init.clk_div);
146         // set range
147         if (hadc->Init.atten3)  //enable 3X mode
148             hadc->Instance->ADC_CFG_REG1 |= (GPADC_ADC_CFG_REG1_ANAU_GPADC_ATTN3X);
149         else //disable 3X mode
150             hadc->Instance->ADC_CFG_REG1 &= (~GPADC_ADC_CFG_REG1_ANAU_GPADC_ATTN3X);
151 #endif
152 
153 
154         /* Disable all slot at initial */
155         for (i = 0; i < 8; i++)
156             HAL_ADC_EnableSlot(hadc, i, 0);
157 
158         // set LDOCORE and LDOREF enable
159 #if (GPADC_CALIB_FLOW_VERSION != 1)
160         // TODO:
161         uint32_t value;
162         value = hadc->Instance->ADC_CFG_REG1;
163         // register default setting from hardware sample code
164 #if (GPADC_CALIB_FLOW_VERSION == 3)
165         value &= ~(GPADC_ADC_CFG_REG1_ANAU_GPADC_VSP | GPADC_ADC_CFG_REG1_ANAU_GPADC_CMM | GPADC_ADC_CFG_REG1_ANAU_GPADC_EN_V18);
166 
167         if (hadc->Init.avdd_v18_en)
168             value |= (0x8 << GPADC_ADC_CFG_REG1_ANAU_GPADC_CMM_Pos) | GPADC_ADC_CFG_REG1_ANAU_GPADC_EN_V18;
169         else
170 #else
171         value &= ~(GPADC_ADC_CFG_REG1_ANAU_GPADC_VSP | GPADC_ADC_CFG_REG1_ANAU_GPADC_CMM);
172 #endif
173             value |= ((2 << GPADC_ADC_CFG_REG1_ANAU_GPADC_VSP_Pos) | (0x10 << GPADC_ADC_CFG_REG1_ANAU_GPADC_CMM_Pos));
174         hadc->Instance->ADC_CFG_REG1 = value;
175 
176 #if (GPADC_CALIB_FLOW_VERSION == 3)
177         hwp_hpsys_cfg->ANAU_CR |= (HPSYS_CFG_ANAU_CR_EN_BG);
178 #endif /* (GPADC_CALIB_FLOW_VERSION == 3) */
179 
180 #else   // (GPADC_CALIB_FLOW_VERSION == 1)
181         hwp_tsen->BGR |= TSEN_BGR_EN;
182         hwp_tsen->ANAU_ANA_TP |= TSEN_ANAU_ANA_TP_ANAU_IARY_EN;
183 #endif
184 
185     }
186     else
187     {
188         /* Update ADC state machine to error */
189         SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
190 
191         tmp_hal_status = HAL_ERROR;
192     }
193 
194     /* Return function status */
195     return tmp_hal_status;
196 }
197 
198 
199 /**
200   * @brief  Deinitialize the ADC peripheral registers to their default reset
201   *         values, with deinitialization of the ADC MSP.
202   * @note   For devices with several ADCs: reset of ADC common registers is done
203   *         only if all ADCs sharing the same common group are disabled.
204   *         If this is not the case, reset of these common parameters reset is
205   *         bypassed without error reporting: it can be the intended behaviour in
206   *         case of reset of a single ADC while the other ADCs sharing the same
207   *         common group is still running.
208   * @param  hadc ADC handle
209   * @retval HAL status
210   */
HAL_ADC_DeInit(ADC_HandleTypeDef * hadc)211 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef *hadc)
212 {
213     HAL_StatusTypeDef tmp_hal_status = HAL_OK;
214 
215     /* Check ADC handle */
216     if (hadc == NULL)
217     {
218         return HAL_ERROR;
219     }
220 
221     /* Set ADC state */
222     SET_BIT(hadc->State, HAL_ADC_STATE_BUSY_INTERNAL);
223 
224     /* Disable ADC peripheral if conversions are effectively stopped */
225     if (tmp_hal_status == HAL_OK)
226     {
227         // reset LDOCORE and LDOREF enable
228         //hadc->Instance->ADC_CFG_REG1 &= (~(GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOCORE_EN|GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN));
229 
230         /* Check if ADC is effectively disabled */
231         if (tmp_hal_status != HAL_ERROR)
232         {
233             /* Change ADC state */
234             hadc->State = HAL_ADC_STATE_READY;
235         }
236     }
237 
238 
239     /* Configuration of ADC parameters if previous preliminary actions are      */
240     /* correctly completed.                                                     */
241     if (tmp_hal_status != HAL_ERROR)
242     {
243         /* Set ADC error code to none */
244         ADC_CLEAR_ERRORCODE(hadc);
245 
246         /* Set ADC state */
247         hadc->State = HAL_ADC_STATE_RESET;
248     }
249 
250     /* Deinitial ADC Msp */
251     HAL_ADC_MspDeInit(hadc);
252 
253     /* Process unlocked */
254     __HAL_UNLOCK(hadc);
255 
256     /* Return function status */
257     return tmp_hal_status;
258 }
259 
HAL_ADC_HwInit(bool cold_boot)260 void HAL_ADC_HwInit(bool cold_boot)
261 {
262 #if defined(SF32LB55X) || defined(SF32LB56X) || defined(SF32LB58X) || defined(SF32LB52X)
263 #ifdef SOC_BF0_HCPU
264     if (cold_boot)
265     {
266         /* init adc by HCPU when cold boot */
267         hwp_gpadc1->ADC_CTRL_REG &= ~GPADC_ADC_CTRL_REG_TIMER_TRIG_EN;
268     }
269 #ifdef SF32LB52X
270     else
271     {
272         /* gpadc1 is by HPSYS side on SF32LB52X */
273         hwp_gpadc1->ADC_CTRL_REG &= ~GPADC_ADC_CTRL_REG_TIMER_TRIG_EN;
274     }
275 #endif /* SF32LB52X */
276 #else
277 #ifndef SF32LB52X
278     if (!cold_boot)
279     {
280         /* init adc by LCPU for non-cold boot as gpadc1 is in LPSYS except SF32LB52X,
281          */
282         hwp_gpadc1->ADC_CTRL_REG &= ~GPADC_ADC_CTRL_REG_TIMER_TRIG_EN;
283     }
284 #endif /* !SF32LB52X */
285 #endif /* SOC_BF0_HCPU */
286 #endif /* SF32LB55X || SF32LB56X || SF32LB58X || SF32LB52X */
287 }
288 
289 /**
290   * @}
291   */
292 
293 /** @defgroup ADC_Exported_Functions_Group2 IO operation functions
294  *  @brief    IO operation functions
295  *
296 @verbatim
297  ===============================================================================
298                       ##### IO operation functions #####
299  ===============================================================================
300     [..]  This section provides functions allowing to:
301       (+) Start conversion of regular group.
302       (+) Stop conversion of regular group.
303       (+) Poll for conversion complete on regular group.
304       (+) Poll for conversion event.
305       (+) Get result of regular channel conversion.
306       (+) Start conversion of regular group and enable interruptions.
307       (+) Stop conversion of regular group and disable interruptions.
308       (+) Handle ADC interrupt request
309       (+) Start conversion of regular group and enable DMA transfer.
310       (+) Stop conversion of regular group and disable ADC DMA transfer.
311 @endverbatim
312   * @{
313   */
314 
315 /**
316   * @brief  Prepare ADC setting before start triger.
317   * @param  hadc ADC handle
318   * @retval HAL status
319   */
HAL_ADC_Prepare(ADC_HandleTypeDef * hadc)320 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_Prepare(ADC_HandleTypeDef *hadc)
321 {
322     if (hadc == NULL)
323         return HAL_ERROR;
324 
325 #if (GPADC_CALIB_FLOW_VERSION != 1)
326 #if (GPADC_CALIB_FLOW_VERSION == 3)
327     // enable analog
328     hwp_hpsys_cfg->ANAU_CR |= (HPSYS_CFG_ANAU_CR_EN_VBAT_MON);
329     hadc->Instance->ADC_CFG_REG1 |= (GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN);
330 #else   /* GPADC_CALIB_FLOW_VERSION == 2 */
331     hadc->Instance->ADC_CFG_REG1 |= (GPADC_ADC_CFG_REG1_ANAU_GPADC_EN_BG | GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN);
332 #endif /* GPADC_CALIB_FLOW_VERSION == 3 */
333     ADC_SET_UNMUTE(hadc);
334 
335 #else   /* (GPADC_CALIB_FLOW_VERSION == 1) */
336     // set LDOCORE and LDOREF enable
337     hadc->Instance->ADC_CFG_REG1 |= (GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOCORE_EN | GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN);
338 #endif
339 
340     HAL_Delay_us(200);
341     hadc->Instance->ADC_CTRL_REG |= (GPADC_ADC_CTRL_REG_FRC_EN_ADC);
342 
343     // TODO: force set to single end, if use differential mode later, add new interface or paramter
344     __HAL_ADC_SINGLE_END(hadc);
345 
346     /* Process locked */
347     __HAL_LOCK(hadc);
348 
349     /* Start conversion if ADC is effectively enabled */
350 
351     /* Set ADC state                                                        */
352     /* - Clear state bitfield related to regular group conversion results   */
353     /* - Set state bitfield related to regular operation                    */
354     ADC_STATE_CLR_SET(hadc->State,
355                       HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_START_IRQ_DONE,
356                       HAL_ADC_STATE_REG_BUSY);
357 
358     /* Reset ADC all error code fields */
359     ADC_CLEAR_ERRORCODE(hadc);
360 #if (GPADC_CALIB_FLOW_VERSION != 1)
361     HAL_Delay_us(200);
362 #else
363     HAL_Delay_us(50);
364 #endif
365     /* Process unlocked */
366     /* Unlock before starting ADC conversions: in case of potential         */
367     /* interruption, to let the process to ADC IRQ Handler.                 */
368     __HAL_UNLOCK(hadc);
369 
370     /* Return function status */
371     return HAL_OK;
372 }
373 
374 /**
375   * @brief  Enables ADC, starts conversion of regular group.
376   *         Interruptions enabled in this function: None.
377   * @param  hadc ADC handle
378   * @retval HAL status
379   */
HAL_ADC_Start(ADC_HandleTypeDef * hadc)380 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hadc)
381 {
382     HAL_StatusTypeDef res = HAL_OK;
383 
384     /* Perform ADC enable and conversion start if no conversion is on going */
385     res = HAL_ADC_Prepare(hadc);
386     if (res == HAL_OK)
387         __HAL_ADC_START_CONV(hadc);
388 
389     return res;
390 }
391 
392 /**
393   * @brief  Stop ADC conversion of regular group, disable ADC peripheral.
394   * @param  hadc ADC handle
395   * @retval HAL status.
396   */
HAL_ADC_Stop(ADC_HandleTypeDef * hadc)397 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef *hadc)
398 {
399     HAL_StatusTypeDef tmp_hal_status = HAL_OK;
400 
401     /* Process locked */
402     __HAL_LOCK(hadc);
403 
404     if (hadc->Init.op_mode != 0)
405         hadc->Instance->ADC_CTRL_REG |= GPADC_ADC_CTRL_REG_ADC_STOP;
406 
407     /* Set ADC state */
408     ADC_STATE_CLR_SET(hadc->State,
409                       HAL_ADC_STATE_REG_BUSY,
410                       HAL_ADC_STATE_READY);
411 
412     // reset LDOCORE and LDOREF enable
413 #if (GPADC_CALIB_FLOW_VERSION != 1)
414 #if (GPADC_CALIB_FLOW_VERSION == 3)
415     hadc->Instance->ADC_CFG_REG1 &= ~(GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN);
416     hwp_hpsys_cfg->ANAU_CR &= (~HPSYS_CFG_ANAU_CR_EN_VBAT_MON);
417 #else   /* (GPADC_CALIB_FLOW_VERSION == 2) */
418     // TODO
419     hadc->Instance->ADC_CFG_REG1 &= ~(GPADC_ADC_CFG_REG1_ANAU_GPADC_EN_BG | GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN);
420 #endif /* (GPADC_CALIB_FLOW_VERSION == 3) */
421     ADC_SET_MUTE(hadc);
422 
423 #else   /* (GPADC_CALIB_FLOW_VERSION == 1) */
424     hadc->Instance->ADC_CFG_REG1 &= (~(GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOCORE_EN | GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN));
425     hadc->Instance->ADC_CTRL_REG &= (~GPADC_ADC_CTRL_REG_FRC_EN_ADC);
426 #endif
427 
428     /* Process unlocked */
429     __HAL_UNLOCK(hadc);
430 
431     /* Return function status */
432     return tmp_hal_status;
433 }
434 
435 /**
436   * @brief  Wait for regular group conversion to be completed.
437   * @param  hadc ADC handle
438   * @param  Timeout Timeout value in millisecond.
439   * @retval HAL status
440   */
HAL_ADC_PollForConversion(ADC_HandleTypeDef * hadc,uint32_t Timeout)441 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef *hadc, uint32_t Timeout)
442 {
443     uint32_t tickstart;
444 
445     /* Check ADC handle */
446     if (hadc == NULL)
447     {
448         return HAL_ERROR;
449     }
450 
451     /* Get tick count */
452     tickstart = HAL_GetTick();
453 
454     /* Wait until End of Conversion flag is raised */
455     while (HAL_IS_BIT_CLR(hadc->Instance->GPADC_IRQ, GPADC_GPADC_IRQ_GPADC_IRSR))
456     {
457         /* Check if timeout is disabled (set to infinite wait) */
458         if (Timeout != HAL_MAX_DELAY)
459         {
460             if ((Timeout == 0) || ((HAL_GetTick() - tickstart) > Timeout))
461             {
462                 /* Update ADC state machine to timeout */
463                 SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
464 
465                 /* Process unlocked */
466                 __HAL_UNLOCK(hadc);
467 
468                 return HAL_TIMEOUT;
469             }
470         }
471     }
472 
473     /* Clear ISR */
474     __HAL_ADC_CLEAR_FLAG(hadc, GPADC_GPADC_IRQ_GPADC_ICR);
475 
476     /* Update ADC state machine */
477     SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
478 
479     return HAL_OK;
480 }
481 
482 /**
483   * @brief  Enables ADC, starts conversion of regular group with interruption.
484   *         Interruptions enabled in this function:
485   *          - EOC (end of conversion of regular group) or EOS (end of
486   *            sequence of regular group) depending on ADC initialization
487   *            parameter "EOCSelection"
488   *          - overrun (if available)
489   *         Each of these interruptions has its dedicated callback function.
490   * @param  hadc ADC handle
491   * @retval HAL status
492   */
HAL_ADC_Start_IT(ADC_HandleTypeDef * hadc)493 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef *hadc)
494 {
495     HAL_StatusTypeDef res = HAL_OK;
496 
497     /* Check ADC handle */
498     if (hadc == NULL)
499     {
500         return HAL_ERROR;
501     }
502 
503     res = HAL_ADC_Prepare(hadc);
504     if (res == HAL_OK)
505     {
506         __HAL_ADC_ENABLE_IRQ(hadc, GPADC_GPADC_IRQ_GPADC_IMR);
507         __HAL_ADC_START_CONV(hadc);
508     }
509 
510     /* Return function status */
511     return res;
512 }
513 
514 
515 /**
516   * @brief  Stop ADC conversion of regular group, disable interruption of
517   *         end-of-conversion, disable ADC peripheral.
518   * @param  hadc ADC handle
519   * @retval HAL status.
520   */
HAL_ADC_Stop_IT(ADC_HandleTypeDef * hadc)521 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef *hadc)
522 {
523     HAL_StatusTypeDef tmp_hal_status = HAL_OK;
524 
525     /* Process locked */
526     __HAL_LOCK(hadc);
527 
528     if (hadc->Init.op_mode != 0)
529         __HAL_ADC_STOP_CONV(hadc);
530 
531     __HAL_ADC_DISABLE_IRQ(hadc, GPADC_GPADC_IRQ_GPADC_IMR);
532 
533     /* Process unlocked */
534     __HAL_UNLOCK(hadc);
535 
536     /* Return function status */
537     return tmp_hal_status;
538 }
539 
540 /**
541   * @brief  Enables ADC, starts conversion of regular group and transfers result
542   *         through DMA.
543   *         Interruptions enabled in this function:
544   *          - DMA transfer complete
545   *          - DMA half transfer
546   *          - overrun
547   *         Each of these interruptions has its dedicated callback function.
548   * @param  hadc ADC handle
549   * @param  pData The destination Buffer address.
550   * @param  Length The length of data to be transferred from ADC peripheral to memory.
551   * @retval None
552   */
HAL_ADC_DMA_PREPARE(ADC_HandleTypeDef * hadc)553 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_DMA_PREPARE(ADC_HandleTypeDef *hadc)
554 {
555     HAL_StatusTypeDef tmp_hal_status = HAL_OK;
556 
557     /* Perform ADC enable and conversion start if no conversion is on going */
558 #if 1
559     {
560 #if (GPADC_CALIB_FLOW_VERSION != 1)
561 #if (GPADC_CALIB_FLOW_VERSION == 3)
562         // TODO
563         hwp_hpsys_cfg->ANAU_CR |= (HPSYS_CFG_ANAU_CR_EN_VBAT_MON);
564         //hwp_hpsys_cfg->ANAU_CR |= (HPSYS_CFG_ANAU_CR_EN_BG);
565         hadc->Instance->ADC_CFG_REG1 |= (GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN);
566 #else
567         hadc->Instance->ADC_CFG_REG1 |= (GPADC_ADC_CFG_REG1_ANAU_GPADC_EN_BG | GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN);
568 #endif
569 
570 #else   //(GPADC_CALIB_FLOW_VERSION == 1)
571         // set LDOCORE and LDOREF enable
572         hadc->Instance->ADC_CFG_REG1 |= (GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOCORE_EN | GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN);
573 #endif
574 
575         hadc->Instance->ADC_CTRL_REG |= (GPADC_ADC_CTRL_REG_FRC_EN_ADC);
576         /* Process locked */
577         __HAL_LOCK(hadc);
578 
579         /* Start conversion if ADC is effectively enabled */
580         if (tmp_hal_status == HAL_OK)
581         {
582             /* Set ADC state                                                        */
583             /* - Clear state bitfield related to regular group conversion results   */
584             /* - Set state bitfield related to regular operation                    */
585             ADC_STATE_CLR_SET(hadc->State,
586                               HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR,
587                               HAL_ADC_STATE_REG_BUSY);
588 
589             /* Reset ADC all error code fields */
590             ADC_CLEAR_ERRORCODE(hadc);
591 #if (GPADC_CALIB_FLOW_VERSION != 1)
592             HAL_Delay_us(200);
593 #else
594             HAL_Delay_us(50);
595 #endif
596             /* Process unlocked */
597             /* Unlock before starting ADC conversions: in case of potential         */
598             /* interruption, to let the process to ADC IRQ Handler.                 */
599             __HAL_UNLOCK(hadc);
600 
601         }
602     }
603 #endif
604 
605     /* Check ADC handle */
606     if (hadc == NULL || hadc->DMA_Handle == NULL)
607     {
608         return HAL_ERROR;
609     }
610 
611     /* Init DMA configure*/
612     //hadc->DMA_Handle->Instance                 = GPADC_DMA_INSTANCE;
613     //hadc->DMA_Handle->Init.Request             = GPADC_DMA_REQUEST;
614     //hadc->DMA_Handle->Init.Direction = DMA_PERIPH_TO_MEMORY;
615     //hadc->DMA_Handle->Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
616     //hadc->DMA_Handle->Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
617     //hadc->DMA_Handle->Init.PeriphInc           = DMA_PINC_DISABLE;
618     //hadc->DMA_Handle->Init.MemInc              = DMA_MINC_ENABLE;
619     //hadc->DMA_Handle->Init.Mode                = DMA_NORMAL;
620     //hadc->DMA_Handle->Init.Priority            = DMA_PRIORITY_MEDIUM;
621     hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt;
622     hadc->DMA_Handle->XferErrorCallback = ADC_DMAError;
623 
624     tmp_hal_status = HAL_DMA_Init(hadc->DMA_Handle);
625     if (tmp_hal_status != HAL_OK)
626         return tmp_hal_status;
627 
628     return tmp_hal_status;
629 }
HAL_ADC_Start_DMA(ADC_HandleTypeDef * hadc,uint32_t * pData,uint32_t Length)630 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length)
631 {
632     HAL_StatusTypeDef tmp_hal_status = HAL_OK;
633 
634     /* Perform ADC enable and conversion start if no conversion is on going */
635 #if 0
636     {
637 #ifndef  SF32LB55X
638 #ifdef SF32LB52X
639         // TODO
640         hwp_hpsys_cfg->ANAU_CR |= (HPSYS_CFG_ANAU_CR_EN_VBAT_MON);
641         //hwp_hpsys_cfg->ANAU_CR |= (HPSYS_CFG_ANAU_CR_EN_BG);
642         hadc->Instance->ADC_CFG_REG1 |= (GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN);
643 #else
644         hadc->Instance->ADC_CFG_REG1 |= (GPADC_ADC_CFG_REG1_ANAU_GPADC_EN_BG | GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN);
645 #endif /* SF32LB52X */
646 
647 #else
648         // set LDOCORE and LDOREF enable
649         hadc->Instance->ADC_CFG_REG1 |= (GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOCORE_EN | GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN);
650 #endif
651 
652         hadc->Instance->ADC_CTRL_REG |= (GPADC_ADC_CTRL_REG_FRC_EN_ADC);
653         /* Process locked */
654         __HAL_LOCK(hadc);
655 
656         /* Start conversion if ADC is effectively enabled */
657         if (tmp_hal_status == HAL_OK)
658         {
659             /* Set ADC state                                                        */
660             /* - Clear state bitfield related to regular group conversion results   */
661             /* - Set state bitfield related to regular operation                    */
662             ADC_STATE_CLR_SET(hadc->State,
663                               HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR,
664                               HAL_ADC_STATE_REG_BUSY);
665 
666             /* Reset ADC all error code fields */
667             ADC_CLEAR_ERRORCODE(hadc);
668 #ifndef  SF32LB55X
669             HAL_Delay_us(200);
670 #else
671             HAL_Delay_us(50);
672 #endif
673             /* Process unlocked */
674             /* Unlock before starting ADC conversions: in case of potential         */
675             /* interruption, to let the process to ADC IRQ Handler.                 */
676             __HAL_UNLOCK(hadc);
677             * /
678 
679         }
680     }
681 #endif
682 
683     /* Check ADC handle */
684     if (hadc == NULL || hadc->DMA_Handle == NULL)
685     {
686         return HAL_ERROR;
687     }
688 #if 0
689     /* Init DMA configure*/
690     hadc->DMA_Handle->Instance                 = GPADC_DMA_INSTANCE;
691     hadc->DMA_Handle->Init.Request             = GPADC_DMA_REQUEST;
692     hadc->DMA_Handle->Init.Direction = DMA_PERIPH_TO_MEMORY;
693     hadc->DMA_Handle->Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
694     hadc->DMA_Handle->Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
695     hadc->DMA_Handle->Init.PeriphInc           = DMA_PINC_DISABLE;
696     hadc->DMA_Handle->Init.MemInc              = DMA_MINC_ENABLE;
697     hadc->DMA_Handle->Init.Mode                = DMA_NORMAL;
698     hadc->DMA_Handle->Init.Priority            = DMA_PRIORITY_MEDIUM;
699     hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt;
700     hadc->DMA_Handle->XferErrorCallback = ADC_DMAError;
701 
702 
703     tmp_hal_status = HAL_DMA_Init(hadc->DMA_Handle);
704     if (tmp_hal_status != HAL_OK)
705         return tmp_hal_status;
706 #endif
707     ADC_DMA_ENABLE(hadc);
708     tmp_hal_status = HAL_DMA_Start(hadc->DMA_Handle, (uint32_t)(&hadc->Instance->ADC_DMA_RDATA), (uint32_t)pData, Length);
709     hadc->Instance->ADC_CTRL_REG |= GPADC_ADC_CTRL_REG_ADC_START;
710 
711     /* Return function status */
712     return tmp_hal_status;
713 }
714 
715 /**
716   * @brief  Stop ADC conversion of regular group, disable ADC DMA transfer, disable
717   *         ADC peripheral.
718   *         Each of these interruptions has its dedicated callback function.
719   * @param  hadc ADC handle
720   * @retval HAL status.
721   */
HAL_ADC_Stop_DMA(ADC_HandleTypeDef * hadc)722 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef *hadc)
723 {
724     HAL_StatusTypeDef tmp_hal_status = HAL_OK;
725 
726     /* Process locked */
727     __HAL_LOCK(hadc);
728 
729     ADC_DMA_DISABLE(hadc);
730 
731     tmp_hal_status = HAL_DMA_Abort(hadc->DMA_Handle);
732 
733     if (hadc->Init.op_mode != 0)
734         hadc->Instance->ADC_CTRL_REG |= GPADC_ADC_CTRL_REG_ADC_STOP;
735 
736     /* Set ADC state */
737     ADC_STATE_CLR_SET(hadc->State,
738                       HAL_ADC_STATE_REG_BUSY,
739                       HAL_ADC_STATE_READY);
740 
741     // reset LDOCORE and LDOREF enable
742 #if (GPADC_CALIB_FLOW_VERSION != 1)
743 #if (GPADC_CALIB_FLOW_VERSION == 3)
744     hadc->Instance->ADC_CFG_REG1 &= ~(GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN);
745     //hwp_hpsys_cfg->ANAU_CR &= (~HPSYS_CFG_ANAU_CR_EN_BG);
746     hwp_hpsys_cfg->ANAU_CR &= (~HPSYS_CFG_ANAU_CR_EN_VBAT_MON);
747 #else
748     // TODO
749     hadc->Instance->ADC_CFG_REG1 &= ~(GPADC_ADC_CFG_REG1_ANAU_GPADC_EN_BG | GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN);
750 #endif
751 #else
752     hadc->Instance->ADC_CFG_REG1 &= (~(GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOCORE_EN | GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN));
753 #endif
754     hadc->Instance->ADC_CTRL_REG &= (~GPADC_ADC_CTRL_REG_FRC_EN_ADC);
755 
756 
757     /* Process unlocked */
758     __HAL_UNLOCK(hadc);
759 
760     /* Return function status */
761     return tmp_hal_status;
762 }
763 
HAL_ADC_DMA_WAIT_DONE(ADC_HandleTypeDef * hadc,uint32_t timeout)764 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_DMA_WAIT_DONE(ADC_HandleTypeDef *hadc, uint32_t timeout)
765 {
766     HAL_StatusTypeDef res = HAL_OK;
767 
768     if ((hadc == NULL) || (hadc->DMA_Handle == NULL))
769         return HAL_ERROR;
770 
771     res = HAL_DMA_PollForTransfer(hadc->DMA_Handle, HAL_DMA_FULL_TRANSFER, timeout);
772 
773     ADC_DMA_DISABLE(hadc);
774 
775     return res;
776 }
777 
778 
779 /**
780   * @brief  Get ADC regular group conversion result.
781   * @note   Reading register DR automatically clears ADC flag EOC
782   *         (ADC group regular end of unitary conversion).
783   * @note   This function does not clear ADC flag EOS
784   *         (ADC group regular end of sequence conversion).
785   *         Occurrence of flag EOS rising:
786   *          - If sequencer is composed of 1 rank, flag EOS is equivalent
787   *            to flag EOC.
788   *          - If sequencer is composed of several ranks, during the scan
789   *            sequence flag EOC only is raised, at the end of the scan sequence
790   *            both flags EOC and EOS are raised.
791   *         To clear this flag, either use function:
792   *         in programming model IT: @ref HAL_ADC_IRQHandler(), in programming
793   *         model polling: @ref HAL_ADC_PollForConversion()
794   *         or @ref __HAL_ADC_CLEAR_FLAG(&hadc, ADC_FLAG_EOS).
795   * @param  hadc ADC handle
796   * @retval ADC group regular conversion data
797   */
HAL_ADC_GetValue(ADC_HandleTypeDef * hadc,uint32_t slot)798 __HAL_ROM_USED uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hadc, uint32_t slot)
799 {
800     uint32_t value, odd;
801     __IO uint32_t *p = &(hadc->Instance->ADC_RDATA0);
802 
803     /* Check ADC handle */
804     if (hadc == NULL || slot >= 8)
805     {
806         return HAL_ERROR;
807     }
808     odd = 0;
809 
810     if (hadc->Init.en_slot == 1)
811     {
812         p += slot / 2;
813         odd = slot % 2;
814     }
815     value = *p;
816 
817     if (odd)
818         value = (value  & GPADC_ADC_RDATA0_SLOT1_RDATA_Msk) >> GPADC_ADC_RDATA0_SLOT1_RDATA_Pos;
819     else
820         value = value & GPADC_ADC_RDATA0_SLOT0_RDATA_Msk;
821 
822     /* Return ADC converted value */
823     return value;
824 }
825 
HAL_ADC_Get_All(ADC_HandleTypeDef * hadc,uint32_t * buf)826 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_Get_All(ADC_HandleTypeDef *hadc, uint32_t *buf)
827 {
828     int i;
829     __IO uint32_t *p = &(hadc->Instance->ADC_RDATA0);
830     uint32_t *data = (uint32_t *)buf;
831 
832     /* Check ADC handle */
833     if (hadc == NULL || buf == NULL)
834         return HAL_ERROR;
835 
836     for (i = 0; i < 8; i++)
837     {
838         if (i & 1)
839         {
840             *data = (*p  & GPADC_ADC_RDATA0_SLOT1_RDATA_Msk) >> GPADC_ADC_RDATA0_SLOT1_RDATA_Pos;
841             p++;
842         }
843         else
844             *data = *p & GPADC_ADC_RDATA0_SLOT0_RDATA_Msk;
845         data++;
846     }
847 
848     return HAL_OK;
849 }
850 
851 
HAL_ADC_SetSource(ADC_HandleTypeDef * hadc,HAL_ADC_SRC__T src)852 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_SetSource(ADC_HandleTypeDef *hadc, HAL_ADC_SRC__T src)
853 {
854     if (hadc == NULL || src > HAL_ADC_SRC_TIMER)
855     {
856         return HAL_ERROR;
857     }
858 
859     hadc->Instance->ADC_CTRL_REG |= (src << GPADC_ADC_CTRL_REG_GPIO_TRIG_EN_Pos);
860 
861     return HAL_OK;
862 }
863 
HAL_ADC_SetTimer(ADC_HandleTypeDef * hadc,HAL_ADC_SRC_TIME_T src)864 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_SetTimer(ADC_HandleTypeDef *hadc, HAL_ADC_SRC_TIME_T src)
865 {
866     if (hadc == NULL || src >= HAL_ADC_SRC_TIMER_CNT)
867     {
868         return HAL_ERROR;
869     }
870 
871     hadc->Instance->ADC_CTRL_REG |= (src << GPADC_ADC_CTRL_REG_TIMER_TRIG_SRC_SEL_Pos);
872 
873     return HAL_OK;
874 }
875 
876 
877 /**
878   * @brief  Handles ADC interrupt request.
879   * @param  hadc ADC handle
880   * @retval None
881   */
HAL_ADC_IRQHandler(ADC_HandleTypeDef * hadc)882 __HAL_ROM_USED void HAL_ADC_IRQHandler(ADC_HandleTypeDef *hadc)
883 {
884     if(__HAL_ADC_GET_FLAG(hadc, GPADC_GPADC_IRQ_GPADC_IRSR))
885         HAL_ADC_ConvCpltCallback(hadc);
886 
887     /* Clear ISR */
888     __HAL_ADC_CLEAR_FLAG(hadc, GPADC_GPADC_IRQ_GPADC_ICR);
889 
890     /* Set status */
891     SET_BIT(hadc->State, HAL_ADC_START_IRQ_DONE);
892 }
893 
894 /**
895   * @brief  Conversion complete callback in non blocking mode
896   * @param  hadc ADC handle
897   * @retval None
898   */
HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef * hadc)899 __weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
900 {
901     /* Prevent unused argument(s) compilation warning */
902     UNUSED(hadc);
903 
904     /* NOTE : This function should not be modified. When the callback is needed,
905               function HAL_ADC_ConvCpltCallback must be implemented in the user file.
906      */
907 }
908 
909 
910 /**
911   * @}
912   */
913 
914 /** @defgroup ADC_Exported_Functions_Group3 Peripheral Control functions
915  *  @brief    Peripheral Control functions
916  *
917 @verbatim
918  ===============================================================================
919              ##### Peripheral Control functions #####
920  ===============================================================================
921     [..]  This section provides functions allowing to:
922       (+) Configure channels on regular group
923       (+) Configure the analog watchdog
924 
925 @endverbatim
926   * @{
927   */
928 
929 /**
930   * @brief  Configures the the selected channel to be linked to the regular
931   *         group.
932   * @note   In case of usage of internal measurement channels:
933   *         VrefInt/Vbat/TempSensor.
934   *         Sampling time constraints must be respected (sampling time can be
935   *         adjusted in function of ADC clock frequency and sampling time
936   *         setting).
937   *         Refer to device datasheet for timings values, parameters TS_vrefint,
938   *         TS_vbat, TS_temp (values rough order: 5us to 17us).
939   *         These internal paths can be be disabled using function
940   *         HAL_ADC_DeInit().
941   * @note   Possibility to update parameters on the fly:
942   *         This function initializes channel into regular group, following
943   *         calls to this function can be used to reconfigure some parameters
944   *         of structure "ADC_ChannelConfTypeDef" on the fly, without reseting
945   *         the ADC.
946   *         The setting of these parameters is conditioned to ADC state.
947   *         For parameters constraints, see comments of structure
948   *         "ADC_ChannelConfTypeDef".
949   * @param  hadc ADC handle
950   * @param  sConfig Structure of ADC channel for regular group.
951   * @retval HAL status
952   */
HAL_ADC_ConfigChannel(ADC_HandleTypeDef * hadc,ADC_ChannelConfTypeDef * sConfig)953 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef *hadc, ADC_ChannelConfTypeDef *sConfig)
954 {
955     HAL_StatusTypeDef tmp_hal_status = HAL_OK;
956     uint32_t value = 0;
957     __IO uint32_t *p = &(hadc->Instance->ADC_SLOT0_REG);
958 
959     /* Check ADC handle */
960     if (hadc == NULL || sConfig == NULL || sConfig->Channel >= 8)
961     {
962         return HAL_ERROR;
963     }
964 
965     /* Process locked */
966     __HAL_LOCK(hadc);
967 
968     if (hadc->Init.en_slot == 1)
969         p += sConfig->Channel;
970 
971     value = *p;
972 
973     value &= ~(GPADC_ADC_SLOT0_REG_NCHNL_SEL | GPADC_ADC_SLOT0_REG_PCHNL_SEL | GPADC_ADC_SLOT0_REG_ACC_NUM);
974     value |= ((sConfig->nchnl_sel << GPADC_ADC_SLOT0_REG_NCHNL_SEL_Pos) & GPADC_ADC_SLOT0_REG_NCHNL_SEL_Msk)
975              | ((sConfig->pchnl_sel << GPADC_ADC_SLOT0_REG_PCHNL_SEL_Pos) & GPADC_ADC_SLOT0_REG_PCHNL_SEL_Msk)
976              | ((sConfig->acc_num << GPADC_ADC_SLOT0_REG_ACC_NUM_Pos) & GPADC_ADC_SLOT0_REG_ACC_NUM_Msk);
977 
978 
979     if (sConfig->slot_en)
980     {
981         value |= GPADC_ADC_SLOT0_REG_SLOT_EN;
982     }
983     else
984     {
985         value &= ~GPADC_ADC_SLOT0_REG_SLOT_EN;
986     }
987 
988     *p = value;
989 
990     /* Process unlocked */
991     __HAL_UNLOCK(hadc);
992 
993     /* Return function status */
994     return tmp_hal_status;
995 }
996 
997 /**
998   * @brief Set ADC sampling frequency.
999   * @param hadc ADC handle.
1000   * @param freq frequence want to be set.
1001   * @retval actual work frequency, 0 if fail.
1002   */
HAL_ADC_SetFreq(ADC_HandleTypeDef * hadc,uint32_t freq)1003 __HAL_ROM_USED uint32_t HAL_ADC_SetFreq(ADC_HandleTypeDef *hadc, uint32_t freq)
1004 {
1005     uint32_t fpclk; // = HAL_RCC_GetPCLKFreq(CORE_ID_LCPU, 1);
1006     uint32_t div; // = fpclk / freq;
1007 
1008     if (freq == 0)
1009         return 0;
1010 
1011     //extern void rt_kprintf(const char *fmt, ...);
1012 #if (GPADC_CALIB_FLOW_VERSION != 3)
1013     fpclk = HAL_RCC_GetPCLKFreq(CORE_ID_LCPU, 1);
1014     div = fpclk / freq;
1015 #else
1016     fpclk = HAL_RCC_GetPCLKFreq(CORE_ID_HCPU, 1);
1017     div = fpclk / freq;
1018 #endif
1019     //for single triger mode, init time will effect adc frequency, init time only work once after strt
1020     //int init_time = (hadc->Instance->ADC_CTRL_REG & GPADC_ADC_CTRL_REG_INIT_TIME_Msk)>>GPADC_ADC_CTRL_REG_INIT_TIME_Pos;
1021     //div = fpclk / (freq * (1+init_time));
1022 #if (GPADC_CALIB_FLOW_VERSION != 1)
1023     uint32_t min_conv, min_samp, data_dly;
1024     uint32_t max_conv, max_samp;
1025 
1026     max_conv = GPADC_ADC_CTRL_REG2_CONV_WIDTH >> GPADC_ADC_CTRL_REG2_CONV_WIDTH_Pos;
1027     max_samp = GPADC_ADC_CTRL_REG2_SAMP_WIDTH >> GPADC_ADC_CTRL_REG2_SAMP_WIDTH_Pos;
1028 #if (GPADC_CALIB_FLOW_VERSION == 3)
1029     uint32_t std_conv, std_samp, std_dly, std_freq;
1030     std_conv = 76;
1031     std_samp = 74;
1032     std_dly = 2;
1033     std_freq = 36000000; // same to ATE
1034     std_freq /= 1000;   // to avoid over range for u32
1035     fpclk /= 1000;     // to avoid over range for u32
1036     min_conv = (std_conv * fpclk + std_freq / 2) / std_freq - 1;
1037     data_dly = (std_dly * fpclk + std_freq / 2) / std_freq;
1038     min_samp = (std_samp * fpclk + std_freq / 2) / std_freq - data_dly - 1;
1039     if ((min_conv > max_conv) || (min_samp > max_samp)) // over rage
1040         HAL_ASSERT(0);
1041 #else
1042     min_conv = 24;
1043     min_samp = 22;
1044     data_dly = 2;
1045 
1046     //cnt = min_conv + min_samp + data_dly + 2;
1047     if ((div <= max_conv * 2) && (div <= max_samp * 2)) // have enough clock
1048     {
1049         min_conv = div / 2;
1050         data_dly = 2;
1051         min_samp = min_conv - data_dly - 2;
1052     }
1053     else // not support
1054         return 0;
1055 #endif
1056 
1057     //sampel rate too high, not support, set to max freq
1058     hadc->Init.data_samp_delay = data_dly;
1059     hadc->Init.conv_width = min_conv;
1060     hadc->Init.sample_width = min_samp;
1061 
1062     __HAL_ADC_SET_SAMPLE_WIDTH(hadc, hadc->Init.sample_width);
1063     __HAL_ADC_SET_CONV_WIDTH(hadc, hadc->Init.conv_width);
1064     __HAL_ADC_SET_DATA_DELAY(hadc, hadc->Init.data_samp_delay);
1065     //rt_kprintf("src freq %d, div %d, data_samp_delay %d, conv_width %d, sample_width %d\n", fpclk, div, data_dly, min_conv, min_samp);
1066 #else
1067     uint32_t maxdiv;
1068     maxdiv = GPADC_ADC_CTRL_REG_ADC_CLK_DIV >> GPADC_ADC_CTRL_REG_ADC_CLK_DIV_Pos;
1069     maxdiv = maxdiv + 1; // divider + 1
1070 
1071     if (div > maxdiv)
1072         div = maxdiv;
1073     if (div < 1)
1074         div = 1;
1075     hadc->Init.clk_div = div - 1;
1076     __HAL_ADC_SET_CLOCK_DIV(hadc, hadc->Init.clk_div);
1077 #endif
1078     return fpclk / div;
1079 }
1080 
HAL_ADC_EnableSlot(ADC_HandleTypeDef * hadc,uint32_t slot,uint8_t en)1081 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_EnableSlot(ADC_HandleTypeDef *hadc, uint32_t slot, uint8_t en)
1082 {
1083     __IO uint32_t *p = &(hadc->Instance->ADC_SLOT0_REG);
1084 
1085     /* Check ADC handle */
1086     if (hadc == NULL || slot >= 8)
1087     {
1088         return HAL_ERROR;
1089     }
1090     if (hadc->Init.en_slot == 1)
1091         p += slot;
1092 
1093     // Clear these bit, disable
1094     //*p &= (~GPADC_ADC_SLOT0_REG_SLOT_EN);
1095     //*p &= (~GPADC_ADC_SLOT0_REG_ACC_NUM);
1096 
1097     if (en != 0)
1098     {
1099         *p |= GPADC_ADC_SLOT0_REG_SLOT_EN;
1100         //*p |= (3 << GPADC_ADC_SLOT0_REG_ACC_NUM_Pos);
1101     }
1102     else
1103     {
1104         *p &= (~GPADC_ADC_SLOT0_REG_SLOT_EN);
1105     }
1106 
1107     return HAL_OK;
1108 }
1109 
HAL_ADC_Set_MultiMode(ADC_HandleTypeDef * hadc,uint8_t multi_mode)1110 __HAL_ROM_USED HAL_StatusTypeDef HAL_ADC_Set_MultiMode(ADC_HandleTypeDef *hadc, uint8_t multi_mode)
1111 {
1112     if (hadc == NULL)
1113         return HAL_ERROR;
1114 
1115     if (multi_mode)
1116         hadc->Init.en_slot = 1;
1117     else
1118         hadc->Init.en_slot = 0;
1119 
1120     return HAL_OK;
1121 }
1122 
1123 
HAL_ADC_Get_Offset(ADC_HandleTypeDef * hadc)1124 __HAL_ROM_USED int HAL_ADC_Get_Offset(ADC_HandleTypeDef *hadc)
1125 {
1126     int offset;
1127 
1128 #if (GPADC_CALIB_FLOW_VERSION != 1)
1129 #if (GPADC_CALIB_FLOW_VERSION == 3)
1130     hadc->Instance->ADC_CFG_REG1 |= (GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN);
1131 #else
1132     // TODO
1133     hadc->Instance->ADC_CFG_REG1 |= (GPADC_ADC_CFG_REG1_ANAU_GPADC_EN_BG | GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN);
1134 #endif
1135 #else
1136 
1137     hadc->Instance->ADC_CFG_REG1 |= GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN;
1138 
1139     hadc->Instance->ADC_CFG_REG1 |= GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOCORE_EN;
1140 #endif
1141     //hadc->Instance->ADC_CFG_REG1 |= GPADC_ADC_CFG_REG1_ANAU_GPADC_SE;
1142     hadc->Instance->ADC_CFG_REG1 |= GPADC_ADC_CFG_REG1_ANAU_GPADC_MUTE;
1143 
1144     hadc->Instance->ADC_SLOT0_REG &= (~GPADC_ADC_SLOT0_REG_ACC_NUM);
1145     hadc->Instance->ADC_SLOT0_REG |= (3 << GPADC_ADC_SLOT0_REG_ACC_NUM_Pos);
1146 
1147     HAL_Delay_us(50);
1148     hadc->Instance->ADC_CTRL_REG |= GPADC_ADC_CTRL_REG_ADC_START;
1149     while (!(hadc->Instance->GPADC_IRQ & GPADC_GPADC_IRQ_GPADC_IRSR_Msk));
1150 
1151     offset = hadc->Instance->ADC_RDATA0 & GPADC_ADC_RDATA0_SLOT0_RDATA_Msk;
1152 
1153     hadc->Instance->GPADC_IRQ |= GPADC_GPADC_IRQ_GPADC_ICR;
1154 
1155 
1156 #if (GPADC_CALIB_FLOW_VERSION != 1)
1157 #if (GPADC_CALIB_FLOW_VERSION == 3)
1158     hadc->Instance->ADC_CFG_REG1 &= ~(GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN);
1159 #else
1160     // TODO
1161     hadc->Instance->ADC_CFG_REG1 &= ~(GPADC_ADC_CFG_REG1_ANAU_GPADC_EN_BG | GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN);
1162 #endif
1163 #else
1164     hadc->Instance->ADC_CFG_REG1 &= ~GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOREF_EN;
1165     hadc->Instance->ADC_CFG_REG1 &= ~GPADC_ADC_CFG_REG1_ANAU_GPADC_LDOCORE_EN;
1166 #endif
1167     hadc->Instance->ADC_CFG_REG1 &= ~GPADC_ADC_CFG_REG1_ANAU_GPADC_MUTE;
1168 
1169     return offset - 512;
1170 }
1171 
1172 /**
1173   * @}
1174   */
1175 
1176 
1177 /** @defgroup ADC_Exported_Functions_Group4 Peripheral State functions
1178  *  @brief    Peripheral State functions
1179  *
1180 @verbatim
1181  ===============================================================================
1182             ##### Peripheral State and Errors functions #####
1183  ===============================================================================
1184     [..]
1185     This subsection provides functions to get in run-time the status of the
1186     peripheral.
1187       (+) Check the ADC state
1188       (+) Check the ADC error code
1189 
1190 @endverbatim
1191   * @{
1192   */
1193 
1194 /**
1195   * @brief  Return the ADC state
1196   * @note   ADC state machine is managed by bitfields, ADC status must be
1197   *         compared with states bits.
1198   *         For example:
1199   *           " if (HAL_IS_BIT_SET(HAL_ADC_GetState(hadc1), HAL_ADC_STATE_REG_BUSY)) "
1200   *           " if (HAL_IS_BIT_SET(HAL_ADC_GetState(hadc1), HAL_ADC_STATE_AWD1)    ) "
1201   * @param  hadc ADC handle
1202   * @retval HAL state
1203   */
HAL_ADC_GetState(ADC_HandleTypeDef * hadc)1204 __HAL_ROM_USED uint32_t HAL_ADC_GetState(ADC_HandleTypeDef *hadc)
1205 {
1206     /* Return ADC state */
1207     return hadc->State;
1208 }
1209 
1210 /**
1211   * @brief  Return the ADC error code
1212   * @param  hadc ADC handle
1213   * @retval ADC Error Code
1214   */
HAL_ADC_GetError(ADC_HandleTypeDef * hadc)1215 __HAL_ROM_USED uint32_t HAL_ADC_GetError(ADC_HandleTypeDef *hadc)
1216 {
1217     return hadc->ErrorCode;
1218 }
1219 
1220 /**
1221   * @brief  Initialize the ADC MSP.
1222   * @param  hadc pointer to a ADC_HandleTypeDef structure that contains
1223   *               the configuration information for ADC module.
1224   * @retval None
1225   */
HAL_ADC_MspInit(ADC_HandleTypeDef * hadc)1226 __weak void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
1227 {
1228     /* Prevent unused argument(s) compilation warning */
1229     UNUSED(hadc);
1230 
1231     /* NOTE : This function should not be modified, when the callback is needed,
1232               the HAL_ADC_MspInit should be implemented in the user file
1233      */
1234 }
1235 
1236 /**
1237   * @brief  De-Initialize the ADC MSP.
1238   * @param  hadc pointer to a ADC_HandleTypeDef structure that contains
1239   *               the configuration information for ADC module.
1240   * @retval None
1241   */
HAL_ADC_MspDeInit(ADC_HandleTypeDef * hadc)1242 __weak void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc)
1243 {
1244     /* Prevent unused argument(s) compilation warning */
1245     UNUSED(hadc);
1246 
1247     /* NOTE : This function should not be modified, when the callback is needed,
1248               the HAL_ADC_MspDeInit should be implemented in the user file
1249      */
1250 }
1251 
1252 /**
1253   * @}
1254   */
1255 
1256 /**
1257   * @}
1258   */
1259 
1260 /** @defgroup ADC_Private_Functions ADC Private Functions
1261   * @{
1262   */
1263 
1264 
1265 /**
1266   * @brief  DMA transfer complete callback.
1267   * @param  hdma pointer to DMA handle.
1268   * @retval None
1269   */
ADC_DMAConvCplt(DMA_HandleTypeDef * hdma)1270 static void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma)
1271 {
1272     /* Retrieve ADC handle corresponding to current DMA handle */
1273     ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
1274 
1275     /* Update state machine on conversion status if not in error state */
1276     if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL | HAL_ADC_STATE_ERROR_DMA))
1277     {
1278         /* Set ADC state */
1279         SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
1280 
1281         /* Conversion complete callback */
1282         HAL_ADC_ConvCpltCallback(hadc);
1283     }
1284     else
1285     {
1286         /* Call DMA error callback */
1287         hadc->DMA_Handle->XferErrorCallback(hdma);
1288     }
1289 
1290 }
1291 
1292 /**
1293   * @brief  DMA error callback
1294   * @param  hdma pointer to DMA handle.
1295   * @retval None
1296   */
ADC_DMAError(DMA_HandleTypeDef * hdma)1297 static void ADC_DMAError(DMA_HandleTypeDef *hdma)
1298 {
1299     /* Retrieve ADC handle corresponding to current DMA handle */
1300     ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
1301 
1302     /* Set ADC state */
1303     SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
1304 
1305     /* Set ADC error code to DMA error */
1306     SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_DMA);
1307 
1308 }
1309 
1310 /**
1311   * @}
1312   */
1313 
1314 #endif /* HAL_ADC_MODULE_ENABLED */
1315 /**
1316   * @}
1317   */
1318 
1319 /**
1320   * @}
1321   */