XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_hal_dac.c
浏览该文件的文档.
1
12/* ==================== [Includes] ========================================== */
13
14#include "xf_hal_dac.h"
15
16#if XF_HAL_DAC_IS_ENABLE
17
18#include "../kernel/xf_hal_dev.h"
19
20/* ==================== [Defines] =========================================== */
21
22#define TAG "hal_dac"
23#define XF_HAL_DAC_TYPE XF_HAL_DAC
24
25/* ==================== [Typedefs] ========================================== */
26
27typedef struct _xf_hal_dac_t {
28 xf_hal_dev_t dev; // 一定要放到第一个,以便后续close一起free
31
32/* ==================== [Static Prototypes] ================================= */
33
35
36/* ==================== [Static Variables] ================================== */
37
38/* ==================== [Macros] ============================================ */
39
40#define XF_HAL_DAC_CHECK(condition, retval, format, ...) \
41 XF_CHECK(condition, retval, TAG, format, ##__VA_ARGS__)
42
43/* ==================== [Global Functions] ================================== */
44
49
51{
53 XF_HAL_DAC_CHECK(!dev, XF_ERR_NOT_FOUND, "dac init failed!");
54
55 return XF_OK;
56}
57
59{
60 xf_err_t err = XF_OK;
61 UNUSED(err);
62
64 xf_hal_dac_t *dev_dac = (xf_hal_dac_t *)dev;
65 XF_HAL_DAC_CHECK(!dev_dac, XF_ERR_UNINIT, "dac is not init!");
66
67 err = xf_hal_driver_close(dev);
68 XF_HAL_DAC_CHECK(err, err, "deinit failed!");
69
70 return XF_OK;
71}
72
74{
75 xf_err_t err = XF_OK;
76 UNUSED(err);
77
79 xf_hal_dac_t *dev_dac = (xf_hal_dac_t *)dev;
80 XF_HAL_DAC_CHECK(!dev_dac, XF_ERR_UNINIT, "dac is not init!");
81
82#if XF_HAL_LOCK_IS_ENABLE
83 xf_lock_lock(dev_dac->dev.mutex);
84#endif
85
86 dev_dac->config.enable = true;
87
88#if XF_HAL_LOCK_IS_ENABLE
89 xf_lock_unlock(dev_dac->dev.mutex);
90#endif
91
93 XF_HAL_DAC_CHECK(err, err, "set resolution failed!");
94
95 return XF_OK;
96}
97
99{
100 xf_err_t err = XF_OK;
101 UNUSED(err);
102
104 xf_hal_dac_t *dev_dac = (xf_hal_dac_t *)dev;
105 XF_HAL_DAC_CHECK(!dev_dac, XF_ERR_UNINIT, "dac is not init!");
106
107#if XF_HAL_LOCK_IS_ENABLE
108 xf_lock_lock(dev_dac->dev.mutex);
109#endif
110
111 dev_dac->config.enable = false;
112
113#if XF_HAL_LOCK_IS_ENABLE
114 xf_lock_unlock(dev_dac->dev.mutex);
115#endif
116
117 err = xf_hal_driver_ioctl(dev, XF_HAL_DAC_CMD_ENABLE, &dev_dac->config);
118 XF_HAL_DAC_CHECK(err, err, "set resolution failed!");
119
120 return XF_OK;
121}
122
124{
125 XF_HAL_DAC_CHECK(resolution > 32, XF_ERR_INVALID_ARG, "dac resolution must less than 32");
126
127 xf_err_t err = XF_OK;
128 UNUSED(err);
129
131 xf_hal_dac_t *dev_dac = (xf_hal_dac_t *)dev;
132 XF_HAL_DAC_CHECK(!dev_dac, XF_ERR_UNINIT, "dac is not init!");
133
134#if XF_HAL_LOCK_IS_ENABLE
135 xf_lock_lock(dev_dac->dev.mutex);
136#endif
137
138 dev_dac->config.resolution = resolution;
139
140#if XF_HAL_LOCK_IS_ENABLE
141 xf_lock_unlock(dev_dac->dev.mutex);
142#endif
143
145 XF_HAL_DAC_CHECK(err, err, "set resolution failed!");
146
147 return XF_OK;
148}
149
151{
152 XF_HAL_DAC_CHECK(speed > 50000000, XF_ERR_INVALID_ARG, "dac sample_rate must less than 50000000");
153
154 xf_err_t err = XF_OK;
155 UNUSED(err);
156
158 xf_hal_dac_t *dev_dac = (xf_hal_dac_t *)dev;
159 XF_HAL_DAC_CHECK(!dev_dac, XF_ERR_UNINIT, "dac is not init!");
160
161#if XF_HAL_LOCK_IS_ENABLE
162 xf_lock_lock(dev_dac->dev.mutex);
163#endif
164
165 dev_dac->config.speed = speed;
166
167#if XF_HAL_LOCK_IS_ENABLE
168 xf_lock_unlock(dev_dac->dev.mutex);
169#endif
170
172 XF_HAL_DAC_CHECK(err, err, "set resolution failed!");
173
174 return XF_OK;
175}
176
177xf_err_t xf_hal_dac_write(xf_dac_num_t dac_num, uint32_t value)
178{
179 xf_err_t err = XF_OK;
180 UNUSED(err);
181
183 xf_hal_dac_t *dev_dac = (xf_hal_dac_t *)dev;
184 XF_HAL_DAC_CHECK(!dev_dac, XF_ERR_UNINIT, "dac is not init!");
185
186#if XF_HAL_LOCK_IS_ENABLE
187 xf_lock_lock(dev_dac->dev.mutex);
188#endif
189
190 XF_ASSERT(value <= dev_dac->config.value_max, XF_ERR_INVALID_ARG, TAG, "value must less than %d", value);
191
192#if XF_HAL_LOCK_IS_ENABLE
193 xf_lock_unlock(dev_dac->dev.mutex);
194#endif
195
196 err = xf_hal_driver_write(dev, &value, 1);
197 // 此处返回正错误码(-err)即可,无需像其他真正的读写那样返回负值错误码
198 XF_HAL_DAC_CHECK(err, -err, "dac write failed!");
199
200 return XF_OK;
201}
202
204{
205 xf_err_t err = XF_OK;
206 UNUSED(err);
207 uint32_t value = 0;
208
210 xf_hal_dac_t *dev_dac = (xf_hal_dac_t *)dev;
211 XF_HAL_DAC_CHECK(!dev_dac, XF_ERR_UNINIT, "dac is not init!");
212
213#if XF_HAL_LOCK_IS_ENABLE
214 xf_lock_lock(dev_dac->dev.mutex);
215#endif
216
217 XF_HAL_DAC_CHECK(mv > dev_dac->config.verf_mv, XF_ERR_INVALID_ARG, "mv must less than %d", dev_dac->config.verf_mv);
218
219 value = dev_dac->config.value_max * mv / dev_dac->config.verf_mv;
220
221#if XF_HAL_LOCK_IS_ENABLE
222 xf_lock_unlock(dev_dac->dev.mutex);
223#endif
224
225 err = xf_hal_driver_write(dev, &value, 1);
226 // 此处返回正错误码(-err)即可,无需像其他真正的读写那样返回负值错误码
227 XF_HAL_DAC_CHECK(err, -err, "dac write failed!");
228
229 return XF_OK;
230}
231
232/* ==================== [Static Functions] ================================== */
233
235{
236 xf_err_t err = XF_OK;
237 UNUSED(err);
238 xf_hal_dev_t *dev = NULL;
239 xf_hal_dac_t *dev_dac = (xf_hal_dac_t *)xf_malloc(sizeof(xf_hal_dac_t));
240 XF_ASSERT(dev_dac, NULL, TAG, "memory alloc failed!");
241
242 dev = (xf_hal_dev_t *)dev_dac;
243
244 err = xf_hal_driver_open(dev, XF_HAL_DAC_TYPE, dac_num);
245
246 if (err) {
247 XF_LOGE(TAG, "open failed!");
248 xf_free(dev);
249 dev = NULL;
250 }
251
252 return dev;
253}
254
255#endif
256
xf_err_t xf_hal_dac_write(xf_dac_num_t dac_num, uint32_t value)
dac 输出电压
Definition xf_hal_dac.c:177
uint32_t xf_dac_num_t
dac 序号。
Definition xf_hal_dac.h:41
xf_err_t xf_hal_dac_set_resolution(xf_dac_num_t dac_num, uint8_t resolution)
dac 设置分辨率。
Definition xf_hal_dac.c:123
xf_err_t xf_hal_dac_init(xf_dac_num_t dac_num)
dac 初始化。
Definition xf_hal_dac.c:50
xf_err_t xf_hal_dac_enable(xf_dac_num_t dac_num)
dac 启用函数。
Definition xf_hal_dac.c:73
xf_err_t xf_hal_dac_disable(xf_dac_num_t dac_num)
dac 禁用函数。
Definition xf_hal_dac.c:98
xf_err_t xf_hal_dac_write_mv(xf_dac_num_t dac_num, uint32_t mv)
dac 输出电压 mv
Definition xf_hal_dac.c:203
xf_err_t xf_hal_dac_set_speed(xf_dac_num_t dac_num, uint32_t speed)
设置 dac 输出速度。
Definition xf_hal_dac.c:150
xf_err_t xf_hal_dac_deinit(xf_dac_num_t dac_num)
dac 反初始化。
Definition xf_hal_dac.c:58
@ XF_HAL_DAC_CMD_ENABLE
Definition xf_hal_dac.h:51
@ XF_HAL_DAC_CMD_RESOLUTION
Definition xf_hal_dac.h:52
#define XF_ASSERT(condition, retval, tag, format,...)
xfusion 断言宏(条件 不成立 时则输出日志后返回)。
Definition xf_check.h:150
int32_t xf_err_t
整形错误类型。 错误码具体值见 xf_err_code_t.
Definition xf_err.h:69
@ XF_ERR_INVALID_ARG
Definition xf_err.h:46
@ XF_OK
Definition xf_err.h:43
@ XF_ERR_NOT_FOUND
Definition xf_err.h:50
@ XF_ERR_UNINIT
Definition xf_err.h:54
int xf_lock_unlock(xf_lock_t lock)
解锁.
Definition xf_lock.c:88
int xf_lock_lock(xf_lock_t lock)
锁定直至成功.
Definition xf_lock.c:72
#define xf_malloc(x)
Definition xf_stdlib.h:38
#define xf_free(x)
Definition xf_stdlib.h:39
用于对接 dac 设置的参数。
Definition xf_hal_dac.h:65
xf_hal_dac_config_t config
Definition xf_hal_dac.c:29
xf_hal_dev_t dev
Definition xf_hal_dac.c:28
xf_err_t xf_hal_dac_register(const xf_driver_ops_t *driver_ops)
dac 设备注册。
Definition xf_hal_dac.c:45
#define XF_HAL_DAC_TYPE
Definition xf_hal_dac.c:23
#define XF_HAL_DAC_CHECK(condition, retval, format,...)
Definition xf_hal_dac.c:40
static xf_hal_dev_t * dac_constructor(xf_dac_num_t dac_num)
Definition xf_hal_dac.c:234
struct _xf_hal_dac_t xf_hal_dac_t
#define TAG
Definition xf_hal_dac.c:22
xf_hal 的 dac(数模转换) 设备。
xf_err_t xf_hal_driver_close(xf_hal_dev_t *dev)
Definition xf_hal_dev.c:192
xf_err_t xf_hal_driver_ioctl(xf_hal_dev_t *dev, uint32_t cmd, void *config)
Definition xf_hal_dev.c:154
xf_err_t xf_hal_driver_open(xf_hal_dev_t *dev, xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:118
int xf_hal_driver_write(xf_hal_dev_t *dev, const void *buf, size_t count)
Definition xf_hal_dev.c:180
xf_hal_dev_t * xf_hal_device_find(xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:238
xf_err_t xf_hal_driver_register(xf_hal_type_t type, xf_hal_flag_t flag, xf_hal_dev_create_t constructor, const xf_driver_ops_t *driver_ops)
Definition xf_hal_dev.c:44
xf_hal_dev_t * xf_hal_driver_create(xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:93
@ XF_HAL_FLAG_ONLY_WRITE
Definition xf_hal_dev.h:53
#define XF_LOGE(tag, format,...)
#define UNUSED(_x)