1 /*
2  * Copyright (C) 2021 Alibaba Group Holding Limited
3  */
4 
5 #ifndef _AOS_ADC_H
6 #define _AOS_ADC_H
7 
8 #include <stdint.h>
9 #include <aos/kernel.h>
10 #include <aos/device.h>
11 
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15 
16 /** @defgroup driver_api driver
17  *  @ingroup aos_components
18  * @{
19  */
20 
21 /** @} */
22 
23 /**
24  * @defgroup aos_adc_app ADC应用操作
25  * @ingroup driver_api
26  * 给应用提供ADC操作的AOS ADC API.
27  *
28  * @{
29  */
30 
31 typedef aos_dev_ref_t aos_adc_ref_t;  /**< ADC设备的引用 */
32 
33 typedef enum {
34     AOS_ADC_MODE_SINGLE,   /**< 单次采样模式 */
35     AOS_ADC_MODE_CONTINUE, /**< 连续采样模式 */
36 } aos_adc_mode_t;
37 
38 /**
39  * 获取一个ADC设备的引用
40  *
41  * @param[out]  ref     ADC设备的引用
42  * @param[in]   id      ADC设备ID
43  *
44  * @return  0: 成功  <0: 失败
45  */
46 aos_status_t aos_adc_get(aos_adc_ref_t *ref, uint32_t id);
47 
48 /**
49  * 释放一个ADC设备的引用
50  *
51  * @param[in]   ref     ADC设备的引用
52  *
53  * @return      无
54  */
55 void aos_adc_put(aos_adc_ref_t *ref);
56 
57 /**
58  * 设置ADC设备的一个通道的采样时间
59  *
60  * @param[in]   ref     ADC设备的引用
61  * @param[in]   channel >=0: 一个通道的ID -1: ADC设备的所有通道
62  * @param[in]   time    采样时间(单位:us)
63  *
64  * @return      0: 成功  <0: 失败
65  */
66 aos_status_t aos_adc_set_sample_time(aos_adc_ref_t *ref, int32_t channel, uint32_t time);
67 
68 /**
69  * 设置ADC设备的工作模式
70  *
71  * @param[in]   ref     ADC设备的引用
72  * @param[in]   mode    工作模式, 当前支持的模式:\n
73  *                      @ref AOS_ADC_MODE_SINGLE: 单次采样模式\n
74  *                      @ref AOS_ADC_MODE_CONTINUE: 连续采样模式\n
75  *
76  * @return      0: 成功  <0: 失败
77  */
78 aos_status_t aos_adc_set_mode(aos_adc_ref_t *ref, aos_adc_mode_t mode);
79 
80 /**
81  * 获取ADC设备的分辨率
82  *
83  * @param[in]   ref         ADC设备的引用
84  * @param[out]  resolution  ADC设备的分辨率 (单位:bits)
85  *
86  * @return      0: 成功  <0: 失败
87  */
88 aos_status_t aos_adc_get_resolution(aos_adc_ref_t *ref, uint32_t *resolution);
89 
90 /**
91  * 获取ADC设备的电压量程(单位:mV)
92  *
93  * @param[in]   ref         ADC设备的引用
94  * @param[in]   channel     >=0: 一个通道的ID -1: ADC设备的所有通道(相同的量程)
95  * @param[out]  range       ADC设备的电压量程(单位:mV)
96  *
97  * @return      0: 成功  <0: 失败
98  */
99 aos_status_t aos_adc_get_range(aos_adc_ref_t *ref, int32_t channel, uint32_t *range);
100 
101 /**
102  * 从ADC设备的一个通道读取原始数据 (同步方式)
103  *
104  * @param[in]   ref      ADC设备的引用
105  * @param[in]   channel  通道ID
106  * @param[out]  data     输出的ADC原始数据
107  *
108  * @return      0: 成功  <0: 失败
109  */
110 aos_status_t aos_adc_read(aos_adc_ref_t *ref, int32_t channel, int32_t *data);
111 
112 /**
113  * 从ADC设备的一个通道读取转换后的电压值(单位: mV) (同步方式)
114  *
115  * @param[in]   ref      ADC设备的引用
116  * @param[in]   channel  通道ID
117  * @param[out]  data     输出的ADC转换后电压值(单位: mV)
118  *
119  * @return      0: 成功  <0: 失败
120  */
121 aos_status_t aos_adc_read_voltage(aos_adc_ref_t *ref, int32_t channel, int32_t *data);
122 
123 /** @} */
124 #ifdef __cplusplus
125 }
126 #endif
127 
128 #endif /* _AOS_ADC_H */
129