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