1 /*
2  * Copyright (c) 2006-2024 RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2020-06-19     thread-liu   the first version
9  */
10 
11 #ifndef __DAC_H__
12 #define __DAC_H__
13 #include <rtthread.h>
14 /**
15  * @defgroup    group_drivers_dac DAC
16  * @brief       DAC driver api
17  * @ingroup     group_device_driver
18  *
19  * <b>Example</b>
20  * @code {.c}
21  *
22  * #include <rtthread.h>
23  * #include <rtdevice.h>
24  * #include <stdlib.h>
25  * #define DAC_DEV_NAME        "dac1"
26  * #define DAC_DEV_CHANNEL     1
27  * #define REFER_VOLTAGE       330
28  * #define CONVERT_BITS        (1 << 12)
29  *
30  * static int dac_vol_sample(int argc, char *argv[])
31  * {
32  *     rt_dac_device_t dac_dev;
33  *     rt_uint32_t value, vol;
34  *     rt_err_t ret = RT_EOK;
35  *
36  *     dac_dev = (rt_dac_device_t)rt_device_find(DAC_DEV_NAME);
37  *     if (dac_dev == RT_NULL)
38  *     {
39  *         rt_kprintf("dac sample run failed! can't find %s device!\n", DAC_DEV_NAME);
40  *         return -RT_ERROR;
41  *     }
42  *
43  *     ret = rt_dac_enable(dac_dev, DAC_DEV_CHANNEL);
44  *
45  *     value = atoi(argv[1]);
46  *     rt_dac_write(dac_dev, DAC_DEV_NAME, DAC_DEV_CHANNEL, value);
47  *     rt_kprintf("the value is :%d \n", value);
48  *
49  *     vol = value * REFER_VOLTAGE / CONVERT_BITS;
50  *     rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);
51  *
52  *     rt_thread_mdelay(500);
53  *
54  *     ret = rt_dac_disable(dac_dev, DAC_DEV_CHANNEL);
55  *
56  *     return ret;
57  * }
58  * MSH_CMD_EXPORT(dac_vol_sample, dac voltage convert sample);
59  *
60  * @endcode
61  */
62 
63 /*!
64  * @addtogroup group_drivers_dac
65  * @{
66  */
67 struct rt_dac_device;
68 /**
69  * @brief Configuration of DAC device
70  */
71 struct rt_dac_ops
72 {
73     rt_err_t (*disabled)(struct rt_dac_device *device, rt_uint32_t channel);
74     rt_err_t (*enabled)(struct rt_dac_device *device, rt_uint32_t channel);
75     rt_err_t (*convert)(struct rt_dac_device *device, rt_uint32_t channel, rt_uint32_t *value);
76     rt_uint8_t (*get_resolution)(struct rt_dac_device *device);
77 };
78 /**
79  * @brief DAC device structure
80  *
81  */
82 struct rt_dac_device
83 {
84     struct rt_device parent;
85     const struct rt_dac_ops *ops;
86 };
87 typedef struct rt_dac_device *rt_dac_device_t;
88 
89 typedef enum
90 {
91     RT_DAC_CMD_ENABLE = RT_DEVICE_CTRL_BASE(DAC) + 0,
92     RT_DAC_CMD_DISABLE = RT_DEVICE_CTRL_BASE(DAC) + 1,
93     RT_DAC_CMD_GET_RESOLUTION = RT_DEVICE_CTRL_BASE(DAC) + 2,
94 } rt_dac_cmd_t;
95 
96 /**
97  * @brief Register a DAC device
98  * @param dac DAC device
99  * @param name DAC name
100  * @param ops the operations of DAC device
101  * @param user_data device private data
102  * @return rt_err_t  error code
103  */
104 rt_err_t rt_hw_dac_register(rt_dac_device_t dac,const char *name, const struct rt_dac_ops *ops, const void *user_data);
105 
106 /**
107  * @brief set the value of DAC
108  * @param dev DAC device
109  * @param channel DAC channel
110  * @param value the value of DAC
111  * @return rt_err_t  error code
112  */
113 rt_err_t rt_dac_write(rt_dac_device_t dev, rt_uint32_t channel, rt_uint32_t value);
114 
115 /**
116  * @brief enable the DAC channel
117  * @param dev DAC device
118  * @param channel DAC channel
119  * @return rt_err_t  error code
120  */
121 rt_err_t rt_dac_enable(rt_dac_device_t dev, rt_uint32_t channel);
122 
123 /**
124  * @brief disable the DAC channel
125  * @param dev DAC device
126  * @param channel DAC channel
127  * @return rt_err_t  error code
128  */
129 rt_err_t rt_dac_disable(rt_dac_device_t dev, rt_uint32_t channel);
130 
131 /*! @}*/
132 
133 #endif /* __dac_H__ */
134