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