1 #include <stdint.h>
2 #include "analogin_api.h"
3 #include "aos/hal/adc.h"
4
5 static analogin_t hal_adc[8];
6
7 static u32 adc_pin2chan[8][2]={
8 {PB_4, 0},
9 {PB_5, 1},
10 {PB_6, 2},
11 {PB_7, 3},
12 {PB_1, 4},
13 {PB_2, 5},
14 {PB_3, 6},
15 {VBAT_MEAS, 7}
16 };
17
18 /**
19 * Initialises an ADC interface, Prepares an ADC hardware interface for sampling
20 *
21 * @param[in] adc the interface which should be initialised
22 *
23 * @return 0 : on success, EIO : if an error occurred with any step
24 */
hal_adc_init(adc_dev_t * adc)25 int32_t hal_adc_init(adc_dev_t *adc)
26 {
27 adc->priv = &hal_adc[adc->port];
28
29 analogin_init(adc->priv, adc_pin2chan[adc->port][0]);
30
31 return 0;
32 }
33
34 /**
35 * Takes a single sample from an ADC interface
36 *
37 * @param[in] adc the interface which should be sampled
38 * @param[out] output pointer to a variable which will receive the sample
39 * @param[in] timeout ms timeout
40 *
41 * @return 0 : on success, EIO : if an error occurred with any step
42 */
hal_adc_value_get(adc_dev_t * adc,uint32_t * output,uint32_t timeout)43 int32_t hal_adc_value_get(adc_dev_t *adc, uint32_t *output, uint32_t timeout)
44 {
45 uint32_t startcount = SYSTIMER_TickGet();
46 analogin_t *adc_t = adc->priv;
47 uint8_t ChIdx = adc_t->adc_idx;
48 uint32_t data;
49
50 /* Set channel index into channel switch list*/
51 ADC->ADC_CHSW_LIST[0] = ChIdx;
52
53 /* Clear FIFO */
54 ADC_ClearFIFO();
55
56 /* SW trigger to sample */
57 ADC_SWTrigCmd(ENABLE);
58 while(1){
59 if(ADC_Readable())
60 break;
61 if(SYSTIMER_GetPassTime(startcount)>timeout)
62 return -1;
63 }
64
65 ADC_SWTrigCmd(DISABLE);
66
67 data = ADC_Read();
68
69 *output = data & BIT_MASK_DAT_GLOBAL;
70
71 return 0;
72
73 }
74
75 /**
76 * De-initialises an ADC interface, Turns off an ADC hardware interface
77 *
78 * @param[in] adc the interface which should be de-initialised
79 *
80 * @return 0 : on success, EIO : if an error occurred with any step
81 */
hal_adc_finalize(adc_dev_t * adc)82 int32_t hal_adc_finalize(adc_dev_t *adc)
83 {
84 analogin_deinit(adc->priv);
85
86 }
87